当前位置: 首页 > 编程语言 > C#

什么时候应该将类成员声明为虚拟(C#)-可重写(VB.NET)?Share

时间:2023-04-10 16:22:36 C#

我什么时候应该声明类成员虚拟(C#)/可覆盖(VB.NET)?为什么我不选择抽象?声明类成员虚拟有哪些限制?只有方法可以声明为虚拟的?抽象方法或属性(都可以是虚拟的或抽象的)只能在抽象类中声明,不能有文字,即你不能在抽象类中实现它。虚方法或属性必须有文字,即必须提供实现(即使文字为空)。如果有人想使用你的抽象类,他将不得不实现一个继承自它的类并显式实现抽象方法和属性,但可以选择不覆盖虚方法和属性。示例:使用系统;使用C=System.Console;namespaceFoo{publicclassBar{publicstaticvoidMain(string[]args){myImplementationOfTestmiot=newmyImplementationOfTest();miot.myVirtualMethod();miot.myOtherVirtualMethod();miot.myProperty=42;miot.myAbstractMethod();}}publicabstractclasstest{publicabstractintmyProperty{get;放;}publicabstractvoidmyAbstractMethod();publicvirtualvoidmyVirtualMethod(){C.WriteLine("foo");}publicvirtualvoidmyOtherVirtualMethod(){}}publicclassmyImplementationOfTest:test{privateint_foo;publicoverrideintmyProperty{get{return_foo;}设置{_foo=值;如果您不想在基类中定义任何实现并且想要强制它在任何派生类中定义,你可以使用abstract。如果你想提供一个可以被派生类覆盖的默认实现,将它定义为虚拟实现。是的,只有方法可以是虚拟的。成员应该是如果存在基础实现,则声明为虚拟的,但可以覆盖子类中的功能。也可以使用Virtual而不是abstract来允许方法实现是可选的(即基础实现是一个空方法)将成员设置为虚拟时没有限制,但虚拟成员比非虚拟成员慢方法。方法和属性都可以标记为虚拟的。WindowsForms需要注意这里的问题。如果你想要一个可以继承的Control/UserControl,即使你在基类中没有逻辑,你也不希望它是抽象的,因为否则你将无法在派生类中使用Designer:http://www.urbanpotato。net/default.aspx/document/2001如果你想在你的基类中给它一个实现,你就把它做成虚拟的,如果你不这样做,你就把它做成抽象的。是的,只能将方法声明为虚拟的。抽象意味着您不能提供默认实现。这反过来意味着所有的子类都必须提供抽象方法的实现才能是(具体的)。我不确定你所说的“限制”是什么意思,所以无法回答这个问题。属性可以声明为虚拟的,但您也可以在概念上将它们视为方法。您的问题与风格有关,而不是技术性。我认为这本书http://www.amazon.com/Framework-Design-Guidelines-Conventions-Development/dp/0321246756围绕您的问题和许多其他问题进行了很好的讨论。首先,我会回答你的第二个问题。只有方法可以声明为虚拟的。当您需要基类的一些默认功能时,您可以选择虚拟而不是抽象,但您希望保留通过从基类继承的类覆盖此功能的选项。一些例子:如果你正在实现Shape类,你可能有一个名为getArea()的方法,它返回你的形状的面积。在这种情况下,Shape类中的getArea()方法没有默认行为,因此您可以将其实现为抽象的。将方法实现为抽象方法将阻止您实例化Shape对象。另一方面,如果你实现Dog类,在这种情况下你可能想要实现Bark()方法,你可能想要实现一个默认的吠声并将它放在Dog类和一些继承类中,例如Chiwawa类可能希望覆盖此方法并实现特定的吠叫声。在这种情况下,方法bark将作为虚拟方法实现,您将能够实例化Dogs和Chiwawas。我个人将大多数方法和属性标记为虚拟的。我经常使用代理和延迟加载,所以我不想担心以后会发生变化。以上是C#学习教程:类成员什么时候应该声明为virtual(C#)/Overridable(VB.NET)?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: