C# 中的虚拟/抽象字段

问题描述 投票:0回答:9

C# 类中是否可以有虚拟/抽象字段?如果可以的话,是怎么做到的?

c# .net oop abstract-class
9个回答
77
投票

虚拟/抽象领域?不。字段只是用来保存数据的。没有什么可实施的。

您可以定义虚拟/抽象属性


17
投票

但是,您可以拥有虚拟或抽象属性:

public abstract string ModelName { get; set; }

10
投票

不可以,字段只能分配,不能覆盖。

但是,您可能可以使用属性,它看起来几乎相同:

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);

除非消费者使用反射,否则它看起来完全一样。


9
投票

MSDN文档的第一句话回答了你的问题:

virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中重写它。

http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx


3
投票

不。字段不能是虚拟抽象,但属性可以。


2
投票

不。您必须使用属性来完成您想要做的事情。


2
投票

一个老问题,但这是我的 2 美分:

虽然可能无法创建虚拟字段 - 可以实现OP似乎正在寻找的东西,即派生类的字段值与基类的字段值不同。

只需在构造函数中为其分配“派生”值即可。

(尽管如果您有像

int i = 1; int j = i;
这样的字段初始值设定项,这还不够)。


1
投票

字段是类中的存储位置 - 您不能“覆盖”它们或使其虚拟。

另一方面,属性可以是虚拟的或抽象的。属性只是 get/set 方法周围的语法糖,它执行检索或设置属性值的工作。


1
投票

财产可以是虚拟的,也许您可以从中受益。至少它在 NHibernate 中被大量使用。

基本上你必须有一种方法来虚拟化,虚拟场应该如何工作?

© www.soinside.com 2019 - 2024. All rights reserved.