Mehrfachvererbung
-
Hi,
ich komme aus der C++ Ecke und tue mich nun etwas schwer, da ich
in C# plötzlich unerwartet keine Mehrfachvererbung machen kann, ....Wie bekomme ich folgendes Problem gelöst:
public abstract class Notification { /// Schnittstelle angeben } public abstract class view : Form,Notification { /// schnittstelle angeben }
Wenn ich aus Notification ein Interface mache, dann muss ich das in
der abstrakten view klasse implementieren.
Das Überschreiben der Implementierten funktion von Notification funktioniert nicht... wäre auch echt doof...
Eigene Funktionspointer machen.... finde ich nicht gerade schön...Dann Notification von Form ableiten ist totaler Nonsense =)...
Grüße
-
Also ich habe es aus meiner sicht eher dreckig gelöst durch
public abstract class GUI_Notification : Form { /// Schnittstelle angeben } public abstract class Notification { /// Schnittstelle angeben } /// Für gui benachrichtigung public abstract class view : GUI_Notification { /// schnittstelle angeben } /// Für nicht GUI ELemente public abstract class view : Notification { /// schnittstelle angeben }
Grüße
-
Grundsätzlich solltest du sowas von Anfang an beim Design der Software berücksichtigen. Also die ganz korrekte Lösung wäre hier, dass du über das Design deiner Software gehst und es entsprechend anpasst, damit sowas nicht passiert. In den meisten Fälle ist dies problemlos möglich.
Die unsaubere Lösung sieht wie folgt aus:
public interface ILeft { void DoLeft(); } public interface IRight { void DoRight(); } public class DefaultLeft : ILeft { public void DoLeft() { Console.WriteLine("Left"); } } public class DefaultRight : IRight { public void DoRight() { Console.WriteLine("Right"); } } public class LeftRight : ILeft, IRight { public DefaultLeft Left { get; private set; } public DefaultRight Right { get; private set; } public LeftRight() { this.Left = new DefaultLeft(); this.Right = new DefaultRight(); } public void DoLeft() { this.Left.DoLeft(); } public void DoRight() { this.Right.DoRight(); } }
Falls
DefaultLeft
, bzw.DefaultRight
, abstrakt sind, dann leitest du private Klassen davon ab und rufst die entsprechenden Funktionen inLeftRight
auf.// Wenn DefaultRight noch was hätte: public abstract class DefaultRight : IRight { // ... public abstract void Foo(); } // Dann in LeftRight public class LeftRight : ILeft, IRight { private class PrivateDefaultRight : DefaultRight { private LeftRight m_outer; public PrivateDefaultRight(LeftRight outer) { m_outer = outer; } public override void Foo() { outer.Foo(); } } public DefaultLeft Left { get; private set; } public DefaultRight Right { get; private set; } public LeftRight() { this.Left = new DefaultLeft(); this.Right = new PrivateDefaultRight(); } public void DoLeft() { this.Left.DoLeft(); } public void DoRight() { this.Right.DoRight(); } public void Foo() { Console.WriteLine("Foo"); } }
Damit erbt aber natürlich
LeftRight
nicht direkt vonDefaultLeft
oderDefaultRight
. Wenn aber irgendwo nun einDefaultLeft
oderDefaultRight
erwartet wird, kannst du die Properties benutzen.Grüssli
-
Sowas passiert beim umsteigen eben ....
Der Entwurf wäre klassen wenn Mehrfachvererbung zugelassen wäre...
Ich habe damit gerechnet als ich das muster angewandt habe...Habe nie erwartet, dass das C# nicht macht....
Werd mir das merken, und beim nächsten mal bercksichtigen..Das es jetzt unsauber wird und ist, ist klar....
Verdammt.....
-
AlexanderKiebler schrieb:
Habe nie erwartet, dass das C# nicht macht...
Deine Punkttaste plenkt.
Aber ansonste: Mehrfachvererbung (außer über Interfaces) wird nur in sehr wenigen Sprachen wegen den Problemen, die diese mit sich bringt, unterstützt.
-
=)... okay werd sie mal reparieren lassen
-
Wenn ich alles nicht tuen würde, was man beim Proggen so nicht macht, dürft ich keine Zeile mehr schreiben *lach*....
-
Dann hör mal lieber auf mit programmieren.