[英]Virtual/Abstract fields in C#
是否可以在C#类中拥有虚拟/抽象字段? 如果是这样,它是如何完成的?
虚拟/抽象领域? 不,字段就在那里可以保存数据。 没有什么可以实现的。
您可以定义虚拟/抽象属性 。
MSDN文档的第一句话回答了您的问题:
virtual关键字用于修改方法,属性,索引器或事件声明,并允许在派生类中重写它。
http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx
不,只能分配一个字段,不能覆盖。
但是,您可能使用属性,它看起来几乎相同
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);
除非消费者使用反射,否则它看起来完全一样。
但是,您可以拥有虚拟或抽象属性:
public abstract string ModelName { get; set; }
编号字段不能是虚拟\\抽象,但属性可以。
一个老问题,但这是我的2美分:
虽然可能无法创建虚拟字段 - 但是可以实现OP似乎正在寻找的内容,即派生类的字段值与基数不同。
只需在构造函数中为其指定“派生”值即可。
(虽然如果你有像int i = 1; int j = i;
)这样的字段初始化器,这是不够的。
字段是类中的存储位置 - 您无法“覆盖”它们或创建虚拟。
另一方面,属性可以是虚拟的或抽象的。 属性只是get / set方法的语法糖,它用于检索或设置属性值。
属性可以是虚拟的,也可以是你可以获得的。 至少它在NHibernate中大量使用。
基本上你必须有一个虚拟化方法,虚拟字段应该如何工作?
不,您必须使用房产来完成您似乎要做的事情。
但是,可以只替换新字段。 看这个例子 :
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.