在MSDN中,提到了,
http://msdn.microsoft.com/en-us/library/9fkccyh4(VS.80).aspx
我很困惑这个项目是什么意思"通过包含使用覆盖修饰符的属性声明,可以在派生类中重写虚拟继承属性."?
(这是虚拟和抽象之间的第二个区别)
乔治,提前谢谢
虚拟和抽象之间的唯一区别是,抽象方法或属性在已定义的类(抽象类)中没有实现,并且必须在子类中重写; 而虚方法或属性在已定义它的类中有一个实现,因此不必在子类中覆盖它.
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; } }
我能理解这种困惑.我以前去过那里,所以我将分享我如何保持基本差异......
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
课堂上.在上面的例子中,abstract
在Human
类上有一个方法意味着它Human
是一个abstract
类,因此,a Human
不能使用短语来实例化var baby = new Human();
.相反,BabyHuman
该类应继承Human
,并应将其实例化为var baby = new BabyHuman();
.因为BabyHuman()
是Human
和EnglishHuman
和ChineseHuman
双方也继承Human
,EnglishHuman
可以继承BabyHuman
,而不是Human
.存在Human
是abstract
因为我们不仅仅是简单的事情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