是否可以在C#类中拥有虚拟/抽象字段?如果是这样,它是如何完成的?
答案 0 :(得分:50)
虚拟/抽象字段?不,字段就在那里可以保存数据。没有什么可以实现的。
答案 1 :(得分:9)
MSDN文档的第一句话回答了您的问题:
virtual关键字用于修改方法,属性,索引器或事件声明,并允许在派生类中重写它。
http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx
答案 2 :(得分:7)
不,一个字段只能分配给not,overridden。
但是,您可以使用属性,它看起来几乎相同
public class MyClass {
public int MyField; //field
public virtual int MyProperty { get; set; } //property
}
都像这样使用:
var x = new MyClass();
Debug.WriteLine("Field is {0}", x.MyField);
Debug.WriteLine("Property is {0}", x.MyProperty);
除非消费者使用反射,否则它看起来完全相同。
答案 3 :(得分:6)
但是,您可以拥有虚拟或抽象属性:
public abstract string ModelName { get; set; }
答案 4 :(得分:2)
没有。字段不能是虚拟\ abstract,但属性可以。
答案 5 :(得分:1)
字段是班级中的存储位置 - 您无法“覆盖”它们或制作虚拟广告。
另一方面,属性既可以是虚拟的也可以是抽象的。属性只是get / set方法的语法糖,它们可以检索或设置属性值。
答案 6 :(得分:1)
属性可以是虚拟的,也许你可以获得。至少它在NHibernate中大量使用。
基本上你必须有一个虚拟化方法,虚拟字段应该如何工作?
答案 7 :(得分:1)
没有。你必须使用一个属性来完成你似乎要做的事情。
答案 8 :(得分:1)
一个老问题,但这是我的2美分:
虽然可能无法创建虚拟字段 - 但是可以实现OP似乎正在寻找的内容,即派生类的字段值与基数不同。< / p>
只需在构造函数中为其指定“派生”值即可。
(如果你有像int i = 1; int j = i;
这样的字段初始化程序,那就不够了。
答案 9 :(得分:-1)
然而,可以只替换新字段。见this example:
public class Program
{
public class A
{
public int f = 3;
}
public class B
{
public int f = 9;
}
public static void Main(string[] args)
{
B bb = new B();
Console.WriteLine(bb.f); // writes 9
}
}