Versuchen Erben zu drei Basis-Klassen, und kann nicht
Ich habe ein paar Fragen zu dem design meiner User
Klasse, aber
Sie sind unterschiedlich genug, dass ich denke, Sie sollten unabhängig sein
Fragen.
So, die erste hängt mit der Vererbung von Basisklassen. Ich bin derzeit auf der
Erben von zwei Klassen ProfileBase
und ISessionMgrEntry
als solche:
public class User : ProfileBase, ISessionMgrEntry
Aber, ich will auch Erben eine Dritte Klasse MembershipUser
wie diese:
public class User : ProfileBase, MembershipUser, ISessionMgrEntry
Jedoch der compiler lässt mich nicht. Warum? Und, wie bekomme ich
herum?
Dank.
PS - ASP.NET 3.5 /C#
BEARBEITEN
Hallo. Ich denke, die unterhalb Lösung kann funktionieren, für was ich versuche zu erreichen. Es scheint ziemlich einfach und straight forward. Ich Tue dies, damit ich eine vollständige/kombinierte User
Objekt. Hat jemand einen Grund, warum diese Probleme verursachen könnte? Eine, die kam während ich dieses ding wird sich überlappenden Eigenschaften. Zum Beispiel, beide MembershipUser
und ProfileBase
teilen "UserName
". Sollte ich wählen Sie einfach eine oder die andere oder ist das ein design Fehler? Vorschläge? Nochmals vielen Dank.
public class User
{
#region Constructors
private readonly MembershipUser _MembershipUser;
private readonly ProfileBase _ProfileBase;
#endregion
public User()
{
_MembershipUser = new MembershipUser();
_ProfileBase = new ProfileBase();
}
public string Comment
{
get { return _MembershipUser.Comment as string; }
set { _MembershipUser.Comment = value; }
}
public bool IsAnonymous
{
get { return _ProfileBase.IsAnonymous as bool; }
}
....
}
InformationsquelleAutor der Frage Peter | 2010-02-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
Im ersten Beispiel bist du nicht eigentlich Erben von zwei Klassen, sondern von einer Klasse und einer Schnittstelle.
C# keine Mehrfachvererbung von Klassen, sondern zulässt, dass Sie mehrere interfaces implementieren. Sehen in diesem MSDN-blog-Beitrag für weitere Informationen darüber, warum.
Haben Sie, um eine
IMembershipUser
- Schnittstelle und implementieren, die in IhremUser
Klasse.Schnittstellen sind in der Regel Vornamen basierend auf den konkreten Klassennamen vorangestellt ist eine
I
. So KlasseMembershipUser
hätte eine SchnittstelleIMembershipUser
. Es gibt nichts zu stoppen Sie mit einem anderen Namen, aber jeder, nutzt Schnittstellen, die verwendet wird, um diese Namenskonvention.InformationsquelleAutor der Antwort ChrisF
in c# kann man einfach Erben von einer Klasseaber implementieren, wie viele Schnittstellenwie Sie wollen.
in Ihrem Fall
ProfileBase
undMembershipUser
sind Klassen undISessionMgrEntry
ist eine Schnittstelle.InformationsquelleAutor der Antwort nWorx
C# nicht erlaubt,Mehrfachvererbung.
InformationsquelleAutor der Antwort BlueRaja - Danny Pflughoeft
C# unterstützt nur einfachvererbung. Sie können entweder Kette zusammen Ihre Klassen (d.h.
MembershipUser
erbt vonProfileBase
) oder verwenden Sieinterfaces
.InformationsquelleAutor der Antwort Jamie Ide
C# erlaubt nur einfachvererbung: Sie können nur Erben von einer Basisklasse. Im ersten Fall
ISessionMgrEntry
ist eine Schnittstelle, die unterschiedlich ist von einer Basisklasse. Hier ist ein guter Artikel zum Unterschied: http://msdn.microsoft.com/en-us/library/ms973861.aspxIm zweiten Fall müssen Sie versuchen, Sie zu beerben beide
ProfileBase
undMembershipUser
die der compiler nicht erlauben. Der beste Weg, dies zu umgehen, wäre zum Kapseln eines (oder beide) derProfileBase
undMembershipUser
.InformationsquelleAutor der Antwort Jeff Hornby
C# keine Mehrfachvererbung.
Im ersten Beispiel sind Sie Erben von
ProfileBase
und deklarieren Sie Ihre Klasse zur Umsetzung derISessionMgrEntry
- Schnittstelle.Können Sie hinzufügen, wie viele interfaces zu einer Klasse, wie Sie wollen (vorausgesetzt, Sie umzusetzen).
InformationsquelleAutor der Antwort Oded
Mehrere Schnittstellen mit identischen Elementnamen sind kein problem. Wenn die Mitglieder teilen sich die gleiche Umsetzung, erstellen Sie einfach einen öffentlichen member mit demselben Namen, wenn Sie die nicht teilen kann die gleichen Umsetzung, Sie können nur explizit implementieren Sie eine (oder alle) der Mitglieder.
Beispielsweise
IEnumerable<T>
erbtIEnumerable
und beide bieten eineGetEnumerator()
Methode mit unterschiedlichen Rückgabetypen. FolglichIEnumerable.GetEnumerator()
ist in der Regel explizit implementiert:Aufrufen
GetEnumerator()
imIEnumerable.GetEnumerator()
ist nicht eine unendlich rekursiven Aufruf; es ruft die public-member mit dem gleichen Namen, nicht selbst (d.h. dieIEnumerable.GetEnumerator()
- Methode).InformationsquelleAutor der Antwort jonp