我想知道是什么使一个类被称为抽象类。我相信,abstract关键字肯定会创建一个类,但如果取出关键字,那么我们就可以创建该类的实例。
换句话说,抽象类的特征是什么。
提前致谢。
-Harsha
答案 0 :(得分:8)
与纯实现类不同,抽象类不会在现实世界中形成具体对象。抽象名称暗示它们持有/定义需要独立重用/定义的相关对象的常见行为在所有相关的对象中。
以鸟类为例。如果你正在编写一个与鸟类有关的程序,那么你将首先得到一个抽象基类作为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();
}
}
答案 1 :(得分:2)
抽象类具有一个独特的特征:不能创建类的实例。抽象类被设计为用作其他抽象类和非抽象类的基类。
答案 2 :(得分:1)
对于类上的abstract
具有任何意义,它必须具有需要实现的抽象成员,否则它是无关紧要的(除非您打算阻止实例化)并且您应该将其删除。
它可能有一个继承者需要声明的抽象属性,就像这个
public abstract int ID { get; }
或必须实施的方法:
public abstract void DoSomething();
如果类本身从未被实例化,但您需要的不仅仅是一个接口,例如基本属性,并且您希望以后再使用它,那么您将使用它:
((MyAbstractClass)obj).DoSomething(); //All inheritors implemented this
答案 3 :(得分:1)
抽象类有两个相关的目的:
抽象类的主要目的是作为后代类的基类,提供一些常用功能,但至少提供后代必须实现的一组通用方法。
例如,您可以使用抽象方法Eat创建一个抽象类Fruit。因为你实际上不能吃“水果”,你需要吃一种特定类型的水果,这个类是抽象的,你永远不会在野外看到一个标有“水果”的物体。
相反,您将看到Apple,Banana,Orange等类型的对象,它们是Fruit的后代,并且具有Eat的实际实现。
除了顶部的两件事之外,抽象类没有什么特别之处。
答案 4 :(得分:1)
我认为还没有人说过这个,但我相信抽象类的区别特征是:
编码器知道如何实现类的X%,以及类应该的实现方式(100-X)%,但是< em>不能。
这就是抽象类的区别。接口描述了如何实现类,但不向实现者提供任何代码或支持。具有虚方法的基类提供了继承者可能覆盖的默认实现。
只有抽象类可以提供部分实现,但不能提供完整的实现。