我有一个简单的应用程序,它有一个抽象类BaseType
,以及两个派生类FirstDerived : BaseType
和SecondDerived : BaseType
。在派生类中,我调用函数base.MakeChange(Item.ID);
来更改嵌入属性Item
的实例值。它没有改变。正如我所解释的那样因为base.MakeChange(Item.ID);
不改变FirstDerived
的实例,所以在函数中它会创建另一个实例。但我认为函数MakeChange
应该引用Item
,因为它是引用类型。似乎MakeChange
获取类型值。为什么?我哪里错了?
namespace ConsoleApplication7
{
class Program
{
static void Main(string[] args)
{
Data d = new Data();
Console.WriteLine(((FirstDerived)d.Items[0]).Item.ID);
Console.ReadKey();
}
}
public class Item
{
public string ID { get; set; }
}
public abstract class BaseType
{
public void MakeChange(string id)
{
id = "5";
}
}
public class FirstDerived : BaseType
{
public FirstDerived()
{
Item = new Item();
Item.ID = "4";
base.MakeChange(Item.ID);
}
public Item Item { get; set; }
}
public class SecondDerived : BaseType
{
public SecondDerived()
{
Item = new Item();
base.MakeChange(Item.ID);
}
public Item Item { get; set; }
}
public class Data
{
public ObservableCollection <BaseType> Items { get; set; }
public Data()
{
Items = new ObservableCollection<BaseType>();
Items.Add(new FirstDerived());
}
}
}
答案 0 :(得分:1)
您正在重置方法中本地作用域id
的值,而不是传入方法的属性。
如果你想这样做,你必须让id
传递引用或者只返回新值:
public string MakeChange(string id)
{
return "5";
}
public void MakeChangeAsRef(ref string id)
{
id = "5";
}
然后这样称呼:
Item.ID = this.MakeChange(Item.ID);
或ref
:
string id = Item.ID;
this.MakeChangeAsRef(ref id);
Item.ID = id;
另一种选择是传递Item
。
(不要打电话给base.
,因为它可能会在某一天打破覆盖该方法。this
现在将做同样的工作)
答案 1 :(得分:1)
public void MakeChange(Item item) 将项目参数作为对象
base.MakeChange(项目);
在您的FirstDerived和SecondDerived中