C# 中的虚拟/抽象字段
Posted
技术标签:
【中文标题】C# 中的虚拟/抽象字段【英文标题】:Virtual/Abstract fields in C# 【发布时间】:2011-11-21 09:30:45 【问题描述】:C# 类中是否可以有虚拟/抽象字段?如果是这样,它是如何完成的?
【问题讨论】:
不,字段只是数据,不包含任何逻辑。没有什么可以覆盖的,所以拥有虚拟字段是没有意义的。 有什么办法可以在基类中声明一个静态字段,但不提供值,而是让所有子类都提供实际值? Imo 字段是一个实现细节,所以这不应该是可能的。 如果您希望创建后代提供的静态“描述”属性,我建议您研究属性,它允许您将自定义元数据与类型相关联。 【参考方案1】:但是,您可以拥有虚拟或抽象属性:
public abstract string ModelName get; set;
【讨论】:
【参考方案2】:一个老问题,但这是我的 2 美分:
虽然可能无法创建虚拟字段 - 可以实现 OP 似乎正在寻找的东西,即派生类的字段值与基类的值不同。
只需在构造函数中为其分配“派生”值。
(虽然如果你有像 int i = 1; int j = i;
这样的字段初始化器,这还不够。
【讨论】:
【参考方案3】:没有。你必须使用一个属性来完成你似乎要做的事情。
【讨论】:
【参考方案4】:属性可以是虚拟的,也许你可以从中获益。至少它在 NHibernate 中被大量使用。
基本上你得有一个虚拟化的方法,虚拟场应该如何工作?
【讨论】:
【参考方案5】:字段是类中的存储位置 - 您不能“覆盖”它们或将其设为虚拟。
另一方面,属性既可以是虚拟的,也可以是抽象的。属性只是 get/set 方法周围的语法糖,它们完成检索或设置属性值的工作。
【讨论】:
【参考方案6】:MSDN 文档的第一句话回答了你的问题:
virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中对其进行覆盖。
http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx
【讨论】:
【参考方案7】:没有。字段不能是虚拟\抽象,但属性可以。
【讨论】:
【参考方案8】:虚拟/抽象领域?不,字段只是用来保存数据的。没有什么可以实现的。
不过你可以define a Virtual/Abstract Property。
【讨论】:
这似乎可以满足我的需求。谢谢。【参考方案9】:不,一个字段只能分配给不,被覆盖。
但是,您可能会使用一个属性,它看起来几乎相同
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);
除非消费者使用反射,否则它看起来完全一样。
【讨论】:
以上是关于C# 中的虚拟/抽象字段的主要内容,如果未能解决你的问题,请参考以下文章