2 Stimmen

Merkmale der abstrakten Klasse

Ich würde gerne wissen, was eine Klasse zu einer abstrakten Klasse macht. Ich glaube, das Schlüsselwort abstrakt macht eine Klasse definitiv zu einer Klasse, aber wenn man das Schlüsselwort herausnimmt, können wir die Instanz der Klasse erstellen.

Mit anderen Worten: Was sind die Merkmale der abstrakten Klasse?

Vielen Dank im Voraus.

-Harsha

8voto

this. __curious_geek Punkte 41801

Eine abstrakte Klasse bildet im Gegensatz zu reinen Implementierungsklassen kein konkretes Objekt in der realen Welt. Abstrakt, wie der Name schon sagt, enthalten/definieren sie gemeinsame Verhaltensweisen von verwandten Objekten, die in allen verwandten Objekten unabhängig voneinander wiederverwendet/definiert werden müssen.

Nehmen wir das Beispiel der Vögel. Wenn Sie ein Programm schreiben, das etwas mit Vögeln zu tun hat, dann haben Sie zunächst eine abstrakte Basisklasse wie Bird und jeden Vogel, der von der abstrakten Basisklasse Bird abgeleitet ist. Beachten Sie, dass die abstrakte Klasse BIRD kein konkretes Objekt der realen Welt darstellt, sondern eine Art von verwandten Objekten, nämlich Vögel!

Beginnen wir mit dem Klassendiagramm und dann mit etwas Code.

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

2voto

Andrew Hare Punkte 332190

Eine abstrakte Klasse hat eine einzigartige Eigenschaft: Es können keine Instanzen der Klasse erstellt werden. Abstrakte Klassen sollen als Basisklassen für andere abstrakte und nicht-abstrakte Klassen verwendet werden.

1voto

Nick Craver Punkte 609016

Für die abstract auf der Klasse irgendeine Bedeutung hat, muss sie abstrakte Mitglieder haben, die implementiert werden müssen, andernfalls ist sie überflüssig (es sei denn, Sie beabsichtigen, die Instanziierung zu verhindern) und Sie sollten sie entfernen.

Es könnte eine abstrakte Eigenschaft haben, die ein Erbe deklarieren muss, etwa so

public abstract int ID { get; }

oder eine Methode, die es implementieren muss:

public abstract void DoSomething();

Sie würden sie verwenden, wenn die Klasse selbst nie instanziiert werden soll, Sie aber mehr als eine Schnittstelle benötigen, z. B. Basiseigenschaften, und Sie sie später verwenden wollen:

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

1voto

Lasse V. Karlsen Punkte 364542

Eine abstrakte Klasse dient zwei verwandten Zwecken:

  1. Sie können abstrakte Mitglieder in die Klasse aufnehmen
  2. Sie können keine Instanz der abstrakten Klasse

Der Hauptzweck einer abstrakten Klasse besteht darin, als Basisklasse für Nachfolgeklassen zu dienen und vielleicht einige gemeinsame Funktionen, zumindest aber einen gemeinsamen Satz von Methoden bereitzustellen, die die Nachfolgeklassen implementieren müssen.

Sie könnten zum Beispiel eine abstrakte Klasse Fruit mit einer abstrakten Methode Eat erstellen. Da man eine "Frucht" nicht wirklich essen kann, sondern eine bestimmte Art von Frucht essen muss, ist die Klasse abstrakt und man wird in der freien Natur nie ein Objekt mit der Bezeichnung "Frucht" sehen.

Stattdessen sehen Sie Objekte des Typs Apfel, Banane, Orange usw., die von Fruit abstammen und die eine tatsächliche Implementierung von Eat haben.

Abgesehen von den beiden oben genannten Dingen gibt es nichts Besonderes an einer abstrakten Klasse.

1voto

Ich glaube nicht, dass das schon jemand gesagt hat, aber ich glaube, das charakteristische Merkmal einer abstrakten Klasse ist:

Der Codierer weiß, wie X% der Klasse es umgesetzt werden, und wie (100-X)% der Klasse sollte sein umgesetzt, die aber kann nicht sein.

Das ist das, was die abstrakte Klasse auszeichnet. Schnittstellen beschreiben, wie eine Klasse implementiert werden sollte, geben den Implementierern aber keinen Code oder Unterstützung. Basisklassen mit virtuellen Methoden bieten Standardimplementierungen, die von den Erben möglicherweise überschrieben werden können.

Es ist nur die abstrakte Klasse, die eine Teilimplementierung, aber keine vollständige Implementierung bereitstellen kann.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X