it-swarm.com.de

Unterstützt C # die Mehrfachvererbung?

Ein Kollege und ich haben etwas Streit wegen der Mehrfachvererbung. Ich sage, es wird nicht unterstützt und er sagt, dass es ist. Also dachte ich, ich würde den klugen Haufen im Netz fragen.

48
Neil Knight

Nein, verwenden Sie stattdessen Schnittstellen! ^. ^

39
Barrie Reader

Leider können Sie nicht von multiple classes erben. Sie können Schnittstellen oder eine Kombination aus one class and interface(s) verwenden, wobei auf Interface (s) der Klassenname in der Signatur folgen sollte.

interface A { }
interface B { }
class Base { }
class AnotherClass { }

Mögliche Wege zum Erben:

class SomeClass : A, B { } // from multiple Interface(s)
class SomeClass : Base, B { } // from one Class and Interface(s)

Das ist nicht legal:

class SomeClass : Base, AnotherClass { }
83
Asad Butt

Mehrfachvererbung wird in C # nicht unterstützt.

Wenn Sie jedoch das Verhalten von zwei Quellen "erben" möchten, verwenden Sie die Combo nicht: 

  • Zusammensetzung

    und 

  • Abhängigkeitsspritze

Es gibt ein grundlegendes, aber wichtiges OOP Prinzip, das besagt: "Komposition der Vererbung vorziehen".

Sie können eine Klasse wie folgt erstellen:

public class MySuperClass
{
    private IDependencyClass1 mDependency1;
    private IDependencyClass2 mDependency2;

    public MySuperClass(IDependencyClass1 dep1, IDependencyClass2 dep2)
    {
        mDependency1 = dep1;
        mDependency2 = dep2;
    }

    private void MySuperMethodThatDoesSomethingComplex()
    {
        string s = mDependency1.GetMessage();
        mDependency2.PrintMessage(s);
    }
}

Wie Sie sehen, werden die Abhängigkeiten (tatsächliche Implementierungen der Schnittstellen) über den Konstruktor eingefügt. Ihre Klasse weiß nicht, wie jede Klasse implementiert ist, weiß aber, wie sie verwendet wird. Daher eine lose Kopplung zwischen den beteiligten Klassen, aber die gleiche Nutzungsstärke.

Die heutigen Trends zeigen, dass Vererbung irgendwie "aus der Mode" ist.

18
Liviu M.

C # 3.5 oder niedriger unterstützt die Mehrfachvererbung nicht, aber C # 4.0 kann dies tun, indem ich, wie ich mich erinnere, Dynamics verwendet.

13
Gnought

In 3.5 können Sie in C # keine Mehrfachvererbung durchführen. Ich weiß nicht, wie es unter 4.0 funktioniert, da ich es nicht angeschaut habe, aber @tbischel hat einen Link gepostet, den ich lesen muss.

Mit C # können Sie "mehrere Implementierungen" über Schnittstellen ausführen, was sich von "Mehrfachvererbung" unterscheidet.

Sie können also nicht tun:

class A{}

class B{}

class C : A, B{}

Sie können aber Folgendes tun:

interface IA{}
interface IB{}

class C : IA, IB{}

HTH

7
Sunny

C # unterstützt keine Mehrfachvererbung von Klassen, Sie können jedoch eine beliebige Anzahl von Schnittstellen erben/implementieren.

Dies ist illegal(B, C, D und E sind alle Klassen)

class A : B, C, D, E
{
}

Dies ist legal(IB, IC, ID & IE sind alle Schnittstellen)

class A : IB, IC, ID, IE
{
}

Dies ist legal(B ist eine Klasse, IC, ID und IE sind Schnittstellen)

class A : B, IC, ID, IE
{
}

Zusammensetzung über Vererbung ist ein Entwurfsmuster, das selbst in Sprachen, die Mehrfachvererbung unterstützen, günstig erscheint.

4
series0ne

Wie Java (von dem C # indirekt abgeleitet wurde), unterstützt C # keine mehrfache Inhertanz.

Dies bedeutet, dass die Klasse data (Member-Variablen und -Eigenschaften) nur von einer einzelnen übergeordneten Basis class geerbt werden kann. Die Klasse behavior (Member-Methoden) kann dagegen von mehreren übergeordneten Basis-Interface vererbt werden.

Einige Experten, insbesondere Bertrand Meyer (von einigen als einer der Väter der objektorientierten Programmierung angesehen) glauben, dass dies C # (und Java und alle anderen) davon abhält, ein "wahres" objektorientiertes Objekt zu sein Sprache.

4
David R Tribble

Eigentlich hängt es von Ihrer Definition der Vererbung ab:

  • sie können Implementierung (Mitglieder, d. h. Daten und Verhalten) von einer single Klasse erben, aber 
  • sie können interface from multiple , na ja, Schnittstellen erben.

Dies ist normalerweise nicht unter dem Begriff "Vererbung" zu verstehen, aber es ist auch nicht völlig unvernünftig, es so zu definieren.

3
Jörg W Mittag

Durch die Mehrfachvererbung können Programmierer Klassen erstellen, die Aspekte mehrerer Klassen und ihrer entsprechenden Hierarchien kombinieren. Für ex. Mit C++ können Sie von mehreren Klassen erben

In C # dürfen die Klassen nur von einer einzigen übergeordneten Klasse erben, die als einfache Vererbung bezeichnet wird. Sie können jedoch Schnittstellen oder eine Kombination aus einer Klasse und Schnittstellen verwenden, wobei für die Schnittstellen der Klassenname in der Signatur stehen sollte.

Ex:

Class FirstClass { }
Class SecondClass { }

interface X { }
interface Y { }

Sie können wie folgt erben:

klasse NewClass: X, Y {} Im obigen Code wird die Klasse "NewClass" aus mehreren Schnittstellen erstellt.

klasse NewClass: FirstClass, X {} Im obigen Code wird die Klasse "NewClass" aus der Schnittstelle X und der Klasse "FirstClass" erstellt.

2
Sandeep Verma

Simuliertes Mehrfachvererbungsmuster
http://www.codeproject.com/KB/architecture/smip.aspxenter image description here

2
Donny V.

Sie können nicht mehrere Klassen gleichzeitig erben. Es gibt jedoch Möglichkeiten, dies mithilfe der Schnittstelle zu tun. Siehe untenstehenden Code 

interface IA
{
    void PrintIA();
}

class  A:IA
{
    public void PrintIA()
    {
        Console.WriteLine("PrintA method in Base Class A");
    }
}

interface IB
{
    void PrintIB();
}

class B : IB
{
    public void PrintIB()
    {
        Console.WriteLine("PrintB method in Base Class B");
    }
}

public class AB: IA, IB
{
    A a = new A();
    B b = new B();

    public void PrintIA()
    {
       a.PrintIA();
    }

    public void PrintIB()
    {
        b.PrintIB();
    }
}

sie können sie wie unten anrufen

AB ab = new AB();
ab.PrintIA();
ab.PrintIB();
2
reza.cse08

Vielleicht möchten Sie noch einen Schritt weiter gehen und über Entwurfsmuster sprechen - und Sie können herausfinden, warum er sich die Mühe machen sollte, mehrere Klassen in c # zu erben, wenn er könnte

2
Jason M

Im Allgemeinen können Sie es nicht tun.

Betrachten Sie diese Schnittstellen und Klassen:

public class A { }    
public class B { }
public class C { }

public interface IA { }
public interface IB { }

Sie können mehrere Schnittstellen erben:

class A : B, IA, IB {
  // Inherits any single base class, plus multiple interfaces.
}

Sie können jedoch nicht mehrere Klassen erben:

class A : B, C, IA, IB {
    // Inherits multiple base classes, plus multiple interfaces.
}
1
Elshan

Es erlaubt es nicht, verwenden Sie die Schnittstelle, um es zu erreichen.

Warum ist es so?

Hier ist die Antwort: Er erlaubte dem Compiler, eine sehr vernünftige und rationale Entscheidung zu treffen, die immer konsistent darüber war, was vererbt wurde und woher es vererbt wurde, so dass Sie beim Casting genau wissen, mit welcher Implementierung Sie sich befassten .

1
Awais Ahmad

C # unterstützt keine integrierte Mehrfachvererbung.

Für das Hinzufügen von Mehrfachvererbung zu Sprachen, die dies nicht unterstützen, können Sie twin design pattern verwenden.

1
Mohsen Kashi

Als zusätzlichen Vorschlag zu dem vorgeschlagenen Ansatz ist es eine weitere clevere Methode, mehrere Funktionen ähnlich der Mehrfachvererbung bereitzustellen, indem mehrere Schnittstellen implementiert werden. Dies wird als mixins bezeichnet. Es ist keine echte Lösung, aber manchmal werden die Probleme behandelt, die Sie dazu auffordern, eine Mehrfachvererbung durchzuführen.

0
Jaxidian

Ich habe mich in der letzten Zeit irgendwie mit der gleichen Denkweise befasst, zwei Klassen in eine Klasse vererbt und auf dieser Seite gelandet (obwohl ich es besser weiß). Ich möchte gerne auf die Lösung, die ich in diesem Szenario gefunden habe, beharren, ohne die Implementierung von Schnittstellen zu erzwingen

Meine Lösung für dieses Problem wäre, Ihre Daten in sinnvolle Klassen aufzuteilen:

public class PersonAddressSuper
{
    public PersonBase Person { get; set; }
    public PersonAddress Address { get; set; }

    public class PersonBase
    {
        public int ID { get; set; }
        public string Name { get; set; }
    }
    public class PersonAddress
    {
        public string StreetAddress { get; set; }
        public string City { get; set; }
    }
}

Später könnten Sie es in Ihrem Code folgendermaßen verwenden:

Beide Teile, Basis und Adresse einschließen

PersonAddressSuper PersonSuper = new PersonAddressSuper();
PersonSuper.PersonAddress.StreetAddress = "PigBenis Road 16";

Nur Basis:

PersonAddressSuper.PersonBase PersonBase = new PersonAddressSuper.PersonBase();
PersonBase.Name = "Joe Shmoe";

Nur Adresse:

PersonAddressSuper.PersonAddress PersonAddress = new PersonAddressSuper.PersonAddress();
PersonAddress.StreetAddress = "PigBenis Road 16";
0
Dementic