C#中的虚拟/抽象字段

时间:2011-09-20 19:43:00

标签: c# .net oop abstract-class

是否可以在C#类中拥有虚拟/抽象字段?如果是这样,它是如何完成的?

10 个答案:

答案 0 :(得分:50)

虚拟/抽象字段?不,字段就在那里可以保存数据。没有什么可以实现的。

但你可以define a Virtual/Abstract Property

答案 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
    }
}