【发布时间】:2015-12-04 14:31:28
【问题描述】:
我有几个“项目”具有相似的功能,因此我从定义通用功能的基类中派生出它们。
之后,我还希望有这些项目的专门列表,因此我从抽象基础容器派生出类似容器的类。
以下代码演示了我的问题。
项目
public abstract class QAbstractItem
{
public int xAbstractMember;
public QAbstractItem(int a)
{
xAbstractMember = a;
}
}
public class QSingleItem : QAbstractItem
{
public int xSingleMember;
public QSingleItem(int s, int a) : base(a)
{
xSingleMember = s;
}
}
列表
public abstract class QAbstractItemsList
{
public List<QAbstractItem> xItems = new List<QAbstractItem>();
protected void add(QAbstractItem xItem)
{
xItems.Add(xItem);
}
public void getFirst(QAbstractItem yItem)
{
yItem = xItems[0]; // XXX
}
}
public class QSingleItemsList : QAbstractItemsList
{
public void add(QSingleItem S)
{
base.add(S);
}
}
用法
QSingleItemsList xSingleList = new QSingleItemsList();
xSingleList.add(new QSingleItem(5, 5));
QSingleItem xFirst = new QSingleItem(0,0);
xSingleList.getFirst(xFirst);
最后一行代码应该(如我所愿)在 xFirst 中包含 (5,5)。但是,它包含 (0,0)。当调试器在线XXX 时,xItems[0] 和 yFirst 都是 (5,5)。当代码返回调用者 (main) 时,xFirst 突然变为 (0,0)。为什么?
非常感谢任何帮助, 丹尼尔
【问题讨论】:
-
您可以使用方法重载并通过 ref 传递参数。例如,一个重载是
public void getFirst(ref QSingleItem yItem)。但您仍然必须在重载方法中进行强制转换。但我认为它更好。yItem = (QAbstractItem)xItems[0];
标签: c# abstract-class derived-class