2010-05-17 74 views
2

我想知道是什么让一个类被称为absract类。我相信,abract关键字定义了一个类的类,但是如果一个关键字取出,那么我们可以创建该类的实例。抽象类的特征

换句话说,抽象类有什么特点。

在此先感谢。

-Harsha

回答

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(); 
    } 
} 
+0

-1使用动物的例子。 – 2010-05-17 16:48:26

+0

是否会伤害任何情绪?你能否证明downvote的理由? – 2010-05-17 17:10:48

+0

非常感谢您的时间和回复。还有其他可以记住的独特角色吗? 再次感谢 – Harsha 2010-05-18 10:42:48

2

一个抽象类具有一个奇异特性:可以创建没有的类的实例。抽象类被设计为用作其他抽象类和非抽象类的基类。

1

对于类abstract有任何意义,它必须有需要实现的抽象成员,否则它是无关的(除非你打算防止实例化),你应该删除它。

它可能有一个抽象的财产的继承人需要声明,这样

public abstract int ID { get; } 

或方法,它必须实现:

public abstract void DoSomething(); 

你会使用它,如果类本身是永远不会被实例化,但您需要的不仅仅是一个接口,例如基本属性,并且您希望稍后使用它:

((MyAbstractClass)obj).DoSomething(); //All inheritors implemented this 
1

一个抽象类有两个相关的用途:

  1. 可以抽象成员放入类
  2. 不能创建抽象类的实例

抽象类的主要目的是服务于作为后代类的基类,提供了可能的一些通用功能,但至少提供了后代必须实现的一套通用方法。例如,您可以使用抽象方法Eat创建一个抽象类Fruit。因为你实际上不能吃一个“水果”,所以你需要吃一种特定类型的水果,课程是抽象的,你永远不会看到一个在野外被标记为“水果”的对象。

取而代之,您将看到苹果,香蕉,橙子等类型的对象,它们是水果的后代,并且具有Eat的实际实现。

除了顶部的两件事之外,抽象类没有什么特别之处。

1

我不认为任何人还没有说这个,但我相信一个抽象类的显着特征是:

编码器知道如何之类的X%实现,以及如何(100 -X)%应该是实现的,但是不能是

这是什么区别抽象类。接口描述了应该如何实现一个类,但是不要给实现者提供任何代码或支持。具有虚拟方法的基类提供了继承者可能覆盖的默认实现。

它只是抽象类可以提供部分实现,但不能提供完整的实现。