繁体   English   中英

C#中的虚拟/抽象字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM