抽象类的特征

时间:2010-05-17 12:40:40

标签: c# oop

我想知道是什么使一个类被称为抽象类。我相信,abstract关键字肯定会创建一个类,但如果取出关键字,那么我们就可以创建该类的实例。

换句话说,抽象类的特征是什么。

提前致谢。

-Harsha

5 个答案:

答案 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)

抽象类有两个相关的目的:

  1. 您可以将抽象成员放入班级
  2. 您无法创建抽象类的实例
  3. 抽象类的主要目的是作为后代类的基类,提供一些常用功能,但至少提供后代必须实现的一组通用方法。

    例如,您可以使用抽象方法Eat创建一个抽象类Fruit。因为你实际上不能吃“水果”,你需要吃一种特定类型的水果,这个类是抽象的,你永远不会在野外看到一个标有“水果”的物体。

    相反,您将看到Apple,Banana,Orange等类型的对象,它们是Fruit的后代,并且具有Eat的实际实现。

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

答案 4 :(得分:1)

我认为还没有人说过这个,但我相信抽象类的区别特征是:

编码器知道如何实现的X%,以及应该的实现方式(100-X)%,但是< em>不能

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

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