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# 中的虚拟/抽象字段的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 接口方法没有声明为抽象或虚拟的?

C#抽象方法和虚拟方法理解

[Unity] C#中级编程 - 06 - 隐藏/虚拟/抽象/覆写/密封

纯抽象基类中的虚拟析构函数

错误 LNK2019 - 抽象类中的虚拟析构函数 [重复]

WinForms 中的 C# 虚拟列表视图