0

virtualC#中的目的是什么?使用它的正确方法和理由是什么?

例如,public virtual ICollection<Order> Orders { get; set; }Client类中定义集合订单(例如,在餐厅或其他地方)。你为什么要在这里使用虚拟?它有什么作用,使用它的一般正确方法是什么?

4

3 回答 3

1

MSDN 有答案http://msdn.microsoft.com/en-us/library/9fkccyh4.aspx

virtual 关键字用于修改方法、属性、索引器或事件声明,并允许在派生类中重写它。例如,这个方法可以被任何继承它的类覆盖:

如果您要创建一个从客户端继承的子类,您将能够覆盖此方法并将其设为只读,或者修改 get 子句,限制添加的集合的大小......等等

于 2013-09-26T00:23:49.627 回答
1

将类的属性/方法/等定义为虚拟使您能够在派生类中覆盖它。

为什么将它与“在餐厅或其他地方说的客户类”一起使用取决于您如何区分不同的客户。如果客户的一个子组总是订购相同的东西,您可以例如覆盖其派生类(来自客户端)中的 Orders 属性以始终返回该特定订单。

于 2013-09-26T00:24:08.977 回答
0

虚函数并非特定于 C#。它们允许在不知道实现细节的情况下,实现对某个基类的对象进行操作的算法,Parent继续对Child从类派生的类对象进行操作。ParentChild

一个简单的例子:Object.ToString。我们可能有一个带有各种控件的表单。如果我们想检查我们有哪些控件,我们可以这样做:

foreach (control in form.Controls)
  Debug.Print(control.ToString())

每个控件都属于某个类,Object该类在其祖先树中始终具有类,并且可以覆盖ToString以提供其自己的有意义的实现。但是,我们不需要知道ToString我们在表单上使用的每个控件类的实现细节,就可以完成这项工作。我们甚至不需要知道是否ToString已被覆盖。

有时,类库的设计者故意将类方法标记为虚拟的,尽管乍一看默认方法实现是非常通用的。这样做是为了未来的灵活性。您的示例可能就是这种情况public virtual ICollection<Order> Orders { get; set; }。将来可能从该类派生新类的开发人员Client将可以选择为Orders属性提供替代行为。例如,负责处理订单的基本库中的代码将继续在二进制级别上与此类新类一起正常工作。无需重新编译基础库。

于 2013-09-26T02:12:25.253 回答