当前位置:  开发笔记 > 编程语言 > 正文

C#中的虚方法问题

如何解决《C#中的虚方法问题》经验,为你挑选了2个好方法。

在MSDN中,提到了,

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

我很困惑这个项目是什么意思"通过包含使用覆盖修饰符的属性声明,可以在派生类中重写虚拟继承属性."?

(这是虚拟和抽象之间的第二个区别)

乔治,提前谢谢



1> Frederik Ghe..:

虚拟和抽象之间的唯一区别是,抽象方法或属性在已定义的类(抽象类)中没有实现,并且必须在子类中重写; 而虚方法或属性在已定义它的类中有一个实现,因此不必在子类中覆盖它.

public abstract AbstractClass
{
    // This class cannot be instantiated, since it is 
    // abstract, and the class is abstract because
    // it has an abstract member

    public abstract MyProperty {get; set; }
}

在您从AbstractClass派生的类中(上面的AbstractClass仅用于解释目的;因为它没有具有实现的方法/特性,您可以创建一个接口而不是一个抽象类),您将不得不提供一个实现MyProperty.否则,它将无法编译.您可以通过"覆盖"MyProperty来实现此目的,您不希望引入新成员,而只是为之前定义的属性提供实现.

public class ConcreteClass : AbstractClass
{
    public override MyProperty {
       get
       {
            return _someValue;
       }
       set
       {
            if( _someValue != value ) _someValue = value;
       }
}



2> EnocNRoll - ..:

我能理解这种困惑.我以前去过那里,所以我将分享我如何保持基本差异......

virtual对比abstract:

如果标记了类方法(或属性)virtual,则可以 使用override 关键字覆盖它,如果您选择从该类继承 (也称为派生).

virtual关键字旨在唤起该方法可能是或可能不是被调用的实际方法的想法.因此,我总是将virtual成员视为默认实现,这意味着它表示可以泛化的功能,例如类Eat()上的方法Human,这可能涉及用一只手吃饭.但是,一个ChineseHuman类可能会覆盖默认实现Eat(),从而允许使用筷子替代的实现.最后,因为虚方法和属性是默认实现,所以定义该成员的类必须提供方法或属性的完整实现.所有Human对象必须知道如何 Eat().

面向对象的思维方式可能会声明virtual成员代表本能.To Eat()是一个类对象的本能Human.一个ChineseHuman可以学习Eat()用筷子.

如果标记了类方法(或属性)abstract,则必须使用override 关键字覆盖它,如果您选择 从该类继承.

abstract关键字旨在唤起这样的想法,即该类仅支持该成员表示的功能,并且没有任何可以为该功能推广的通用逻辑.换句话说,abstract成员只是概念性的,因此缺乏实施.override当我们实现继承关系时,C#要求我们抽象成员,这有点令人困惑,但在这种情况下,它确实意味着我们用一个具体的实现来覆盖空概念.类的abstract成员的示例Human可能是Speak().对于所有Human对象都没有通用的说话方式,也不是本能的,因为它需要语言来表达.注意:有些人可能认为它Speak()属于一个interface代替.

面向对象的思维方式可能会声明abstract成员代表要学习的行为(方法)以及要获取的知识或信仰(属性).To Speak()是类对象的学习行为Human.A ChineseHuman可能会学习与a Speak()不同EnglishHuman,也不知道如何Speak()只是因为它们都是Human.

细微之处:

virtual 方法不需要被覆盖.

没有virtual班级这样的东西.

abstract成员只能出现在abstract课堂上.在上面的例子中,abstractHuman类上有一个方法意味着它Human是一个abstract类,因此,a Human不能使用短语来实例化var baby = new Human();.相反,BabyHuman该类应继承Human,并应将其实例化为var baby = new BabyHuman();.因为BabyHuman()HumanEnglishHumanChineseHuman双方也继承Human,EnglishHuman可以继承BabyHuman,而不是Human.存在Humanabstract因为我们不仅仅是简单的事情Human.

abstract成员不能被隐藏,只有他们的override实现可能是(继承链).例如,BabyHuman必须将abstract Speak()方法实现为override.如果EnglishHuman从继承BabyHuman,它可能然后隐藏BabyHuman的实现Speak()通过使用其自己的实现new关键字(参见"C#方法隐藏"的参考).

abstract课程可以有virtual成员.这是一个interface和一个abstract类之间的主要区别.从这个意义上讲,abstract类可以定义类的行为的契约和模板,而interface只定义契约.

代码参考:

抽象类与接口
作者:Rahman Mahmoodi
http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx

隐藏在C#中的方法
作者:Chetan Kudalkar
http://www.codeproject.com/KB/cs/cs_methodhiding.aspx

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有