Fre*_*els 10
虚拟和抽象之间的唯一区别是,抽象方法或属性在已定义的类(抽象类)中没有实现,并且必须在子类中重写; 而虚方法或属性在已定义它的类中有一个实现,因此不必在子类中覆盖它.
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; }
}
Run Code Online (Sandbox Code Playgroud)
在您从AbstractClass派生的类中(上面的AbstractClass仅用于解释目的;因为它没有具有实现的方法/特性,您可以创建一个接口而不是一个抽象类),您将不得不提供一个实现MyProperty.否则,它将无法编译.您可以通过"覆盖"MyProperty来实现此目的,您不希望引入新成员,而只是为之前定义的属性提供实现.
public class ConcreteClass : AbstractClass
{
public override MyProperty {
get
{
return _someValue;
}
set
{
if( _someValue != value ) _someValue = value;
}
}
Run Code Online (Sandbox Code Playgroud)
我能理解这种困惑.我以前去过那里,所以我将分享我如何保持基本差异......
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只定义契约.代码参考: