2010-02-04 2 views
17

Ich habe ein paar Fragen im Zusammenhang mit dem Design meiner User Klasse, aber sie sind unterschiedlich genug, dass ich denke, sie sollten unabhängig sein Fragen.Versuchen, drei Basisklassen zu erben und kann nicht

So bezieht sich das erste auf Vererbung von Basisklassen. Ich bin derzeit erben zwei Klassen, ProfileBase und ISessionMgrEntry als solche:

public class User : ProfileBase, ISessionMgrEntry 

Aber ich möchte auch eine dritte Klasse erben, MembershipUser, wie folgt aus:

public class User : ProfileBase, MembershipUser, ISessionMgrEntry 

jedoch der Compiler won‘ Lass mich das machen. Warum? Und wie bekomme ich um dies?

Danke.

PS - ASP.NET 3.5/C#

EDIT

Hallo. Ich denke, dass die folgende Lösung für das funktionieren kann, was ich versuche zu erreichen. Es scheint ziemlich einfach und geradlinig. Ich mache das, damit ich ein vollständiges/kombiniertes User Objekt erstellen kann. Sieht jemand irgendeinen Grund, warum dies Probleme verursachen könnte? Eine, die kam, während ich dies dingte, ist überlappende Eigenschaften. Zum Beispiel teilen sich sowohl MembershipUser als auch ProfileBase "UserName". Sollte ich nur das eine oder das andere wählen oder wird das ein Designfehler sein? Vorschläge? Danke noch einmal.

+0

Warum wie Sie 'wie' auf den Stützen tun? – ChaosPandion

+0

Sie haben Recht, ich dachte, das sah aus. Ich folgte dieser Konvention, aber realisieren, dass es ein anderer Fall ist: [SettingsAllowAnonymous (false), CustomProviderData ("IPAddress; string")] öffentliche Zeichenfolge IPAddress {get {return base ["IPAddress"] als Zeichenfolge; } set {base ["IPAddress"] = Wert; }} –

Antwort

28

Im ersten Beispiel erben Sie nicht wirklich von zwei Klassen, sondern von einer Klasse und einer Schnittstelle.

C# lässt keine Mehrfachvererbung aus Klassen zu, ermöglicht jedoch die Implementierung mehrerer Schnittstellen. Weitere Informationen dazu finden Sie unter this MSDN blog post.

Sie müssen eine IMembershipUser Schnittstelle herstellen und diese in Ihrer User Klasse implementieren.

Schnittstellen werden normalerweise auf der Grundlage des konkreten Klassennamens mit dem Präfix I benannt. Die Klasse MembershipUser hätte also eine Schnittstelle IMembershipUser. Es gibt nichts, was Sie daran hindert, einen anderen Namen zu verwenden, aber jeder, der Schnittstellen verwendet, ist an diese Namenskonvention gewöhnt.

+0

Danke Chris. Kannst du mir einen Blick auf meine Edit werfen, wenn du einen Moment Zeit hast? Danke nochmal für deine Hilfe. –

+1

@Code Sherpa - Ich müsste wirklich mehr Code sehen und mehr Konversation haben, als über SO möglich ist, aber wenn du duplizierte Eigenschaften hast, solltest du eine andere Klassenhierarchie betrachten. – ChrisF

1

C# unterstützt keine Mehrfachvererbung.

Im ersten Beispiel erben Sie von ProfileBase und deklarieren Ihre Klasse zur Implementierung der ISessionMgrEntry Schnittstelle.

Sie können einer Klasse beliebig viele Schnittstellen hinzufügen (sofern Sie sie alle implementieren).

3

C# unterstützt nur einzelne Vererbung. Sie können Ihre Klassen entweder zusammenketten (d. H. MembershipUser erbt von ProfileBase) oder interfaces verwenden.

5

in C# Sie können nur von einer Klasse erben, aber implementieren, wie viele Schnittstellen wie Sie wollen. in Ihrem Fall ProfileBase und MembershipUser sind Klassen und ISessionMgrEntry ist eine Schnittstelle.

2

C# erlaubt nur eine einzelne Vererbung: Sie können nur von einer Basisklasse erben. Im ersten Fall ist ISessionMgrEntry eine Schnittstelle, die sich von einer Basisklasse unterscheidet. Hier ist ein guter Artikel über den Unterschied: http://msdn.microsoft.com/en-us/library/ms973861.aspx

Im zweiten Fall versuchen Sie beide erben von ProfileBase und MembershipUser, die der Compiler nicht erlauben. Der beste Weg, dies zu umgehen, wäre, einen (oder beide) von ProfileBase und MembershipUser zu kapseln.

0

Mehrere Schnittstellen mit identischen Mitgliedsnamen sind kein Problem. Wenn die Mitglieder dieselbe Implementierung verwenden können, erstellen Sie einfach ein öffentliches Mitglied mit demselben Namen. Wenn sie nicht dieselbe Implementierung verwenden können, können Sie nur einen (oder alle) der Member explizit implementieren.

Zum Beispiel IEnumerable<T> erbt IEnumerable, und beide bieten eine GetEnumerator() Methode mit unterschiedlichen Rückgabetypen. Folglich wird IEnumerable.GetEnumerator() im Allgemeinen ausdrücklich umgesetzt:

class Foo : IEnumerable<object>{ 
    // explicitly implement IEnumerable.GetEnumerator() 
    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public IEnumerator<object> GetEnumerator() 
    { 
     yield break; 
    } 
} 

Aufruf GetEnumerator() in IEnumerable.GetEnumerator() ist nicht unendlich rekursive Aufruf; es ruft das öffentliche Mitglied mit demselben Namen nicht selbst auf (d. h. das IEnumerable.GetEnumerator()-Verfahren).

+0

danke Mann - das hat es für mich aussortiert. sehr geschätzt! –

Verwandte Themen