我想知道是什么让一个类被称为absract类。我相信,abract关键字定义了一个类的类,但是如果一个关键字取出,那么我们可以创建该类的实例。抽象类的特征
换句话说,抽象类有什么特点。
在此先感谢。
-Harsha
我想知道是什么让一个类被称为absract类。我相信,abract关键字定义了一个类的类,但是如果一个关键字取出,那么我们可以创建该类的实例。抽象类的特征
换句话说,抽象类有什么特点。
在此先感谢。
-Harsha
与纯粹的实现类不同,抽象类不构成真实世界中的具体对象。抽象名称建议他们持有/定义需要在所有相关对象中独立重用/定义的相关对象的共同行为。
举一个鸟的例子。如果你正在编写一个与鸟类有关的程序,那么你首先会得到一个抽象的基类,如Bird,每个鸟类都来自抽象基类Bird。请注意,抽象类BIRD并不代表一个具体的真实世界对象,而是一种相关的对象,即鸟类!
让我们从类图开始,然后是一些代码。
alt text http://ruchitsurati.net/files/birds.png
public abstract class Bird
{
protected string Name = string.Empty;
public Bird(string name)
{
this.Name = name;
}
public virtual void Fly()
{
Console.WriteLine(string.Format("{0} is flying.", this.Name));
}
public virtual void Run()
{
Console.WriteLine(string.Format("{0} cannot run.", this.Name));
}
}
public class Parrot : Bird
{
public Parrot() : base("parrot") { }
}
public class Sparrow : Bird
{
public Sparrow() : base("sparrow") { }
}
public class Penguin : Bird
{
public Penguin() : base("penguin") { }
public override void Fly()
{
Console.WriteLine(string.Format("{0} cannot fly. Some birds do not fly.", this.Name));
}
public override void Run()
{
Console.WriteLine(string.Format("{0} is running. Some birds do run.", this.Name));
}
}
class Program
{
static void Main(string[] args)
{
Parrot p = new Parrot();
Sparrow s = new Sparrow();
Penguin pe = new Penguin();
List<Bird> birds = new List<Bird>();
birds.Add(p);
birds.Add(s);
birds.Add(pe);
foreach (Bird bird in birds)
{
bird.Fly();
bird.Run();
}
Console.ReadLine();
}
}
一个抽象类具有一个奇异特性:可以创建没有的类的实例。抽象类被设计为用作其他抽象类和非抽象类的基类。
对于类abstract
有任何意义,它必须有需要实现的抽象成员,否则它是无关的(除非你打算防止实例化),你应该删除它。
它可能有一个抽象的财产的继承人需要声明,这样
public abstract int ID { get; }
或方法,它必须实现:
public abstract void DoSomething();
你会使用它,如果类本身是永远不会被实例化,但您需要的不仅仅是一个接口,例如基本属性,并且您希望稍后使用它:
((MyAbstractClass)obj).DoSomething(); //All inheritors implemented this
一个抽象类有两个相关的用途:
抽象类的主要目的是服务于作为后代类的基类,提供了可能的一些通用功能,但至少提供了后代必须实现的一套通用方法。例如,您可以使用抽象方法Eat创建一个抽象类Fruit。因为你实际上不能吃一个“水果”,所以你需要吃一种特定类型的水果,课程是抽象的,你永远不会看到一个在野外被标记为“水果”的对象。
取而代之,您将看到苹果,香蕉,橙子等类型的对象,它们是水果的后代,并且具有Eat的实际实现。
除了顶部的两件事之外,抽象类没有什么特别之处。
我不认为任何人还没有说这个,但我相信一个抽象类的显着特征是:
编码器知道如何之类的X%是实现,以及如何(100 -X)%应该是实现的,但是不能是。
这是什么区别抽象类。接口描述了应该如何实现一个类,但是不要给实现者提供任何代码或支持。具有虚拟方法的基类提供了继承者可能覆盖的默认实现。
它只是抽象类可以提供部分实现,但不能提供完整的实现。
-1使用动物的例子。 – 2010-05-17 16:48:26
是否会伤害任何情绪?你能否证明downvote的理由? – 2010-05-17 17:10:48
非常感谢您的时间和回复。还有其他可以记住的独特角色吗? 再次感谢 – Harsha 2010-05-18 10:42:48