2017-11-14 3 views
1

Angenommen, ich habe eine Vater-Klasse, die an Kinder-Klassen vererbt wird, später möchte ich mehr Dinge in die Vater-Klasse einfügen, ohne die ursprüngliche Vater-Klasse zu modifizieren, bitte bring mir bei, wie ich es machen könnte.Wie fügen Sie Zeug in bestehende Basisklasse in C#?

Lassen Sie mich meine Frage klären. Alle Wertsachen und Methoden in Vater werden automatisch für alle Kinderklassen zugänglich sein, richtig? Zum Beispiel:

public class Father 
{ 
    public int a; 
    public int b; 
    public int c() 
    { 
     return a+b; 
    } 
} 

public class Child : Father 
{ 
    private int d=a*b+c(); 
} 

Jetzt mag ich ein boolean e und ein Verfahren f() zu Vater hinzufügen, damit mein Kind direkt darauf zugreifen können, ohne diese Zeilen direkt in Vater hinzufügen oder eine neue Klasse zwischen Vater machen und Kind. Ist das möglich? Wie könnte ich es tun?

+0

Sie nutzen könnten [parti Al-Klassen] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/partial-classes-and-methods). Sie ändern noch die ursprüngliche Elternklasse, aber in einer separaten Datei. Sie können auch [Erweiterungsmethoden] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/extension-methods) verwenden, um Ihrer Parent-Klasse zusätzliche Funktionen hinzuzufügen ohne die ursprüngliche Klasse zu ändern. – sniels

+0

Sie haben Recht, dass Sie teilweise hinzufügen müssen, was die ursprüngliche Klasse ändert, obwohl von diesem Punkt an es möglich ist. Erweiterungsmethoden können auf Schnittstellen und Klassen angewendet werden. In Zukunft können Sie sogar Erweiterungseigenschaften hinzufügen. Daher sollten Erweiterungsmethoden die Aufgabe erfüllen. Obwohl der Zweck nicht klar ist. Ich denke, dass Sie ein besseres OOP-Design herausfinden müssen, um Ihr Ziel zu erreichen. – sniels

+0

Wenn ich mich recht erinnere, muss die "ursprüngliche Klasse" auch partiell sein, damit die Teilklassen funktionieren. Was ist wenn das NICHT der Fall ist? Und wenn ich die Erweiterungsmethoden verwende, wäre es genauso wie ich eine neue Klasse erstellen würde. Es besiegt den Zweck hier! Gibt es einen anderen Weg als diese beiden, die den Trick machen werden? Vielen Dank! –

Antwort

2

Sie suchen nach Erweiterungsmethoden. Weitere Informationen finden Sie unter this post.

2

Wenn Sie Ihrem Vatermodell weitere Felder hinzufügen möchten, sollte Ihre Vererbungsstruktur möglicherweise geändert werden.

Zum Beispiel hatte man das Modell A und Modell B Modell B-Felder von Modell geerbt A

public class A 
{ 
    public string FieldA { get; set; } 
} 

public class B : A 
{ 
    public string FieldB { get; set; } 
} 

diese Weise wird die Klasse-B-Felder FieldA und FieldB hat.

Wenn Sie nun möchten, dass Ihre Klasse B von einer Klasse erbt, die die Felder von A hat, aber Sie könnten Ihrem Vererbungsbaum eine weitere Ebene hinzufügen.

public class A 
{ 
    public string FieldA { get; set; } 
} 

public class C : A 
{ 
    public string FieldC { get; set; } 
} 

public class B : C 
{ 
    public string FieldB { get; set; } 
} 

Jetzt ist Ihre Klasse B hat Felder FieldA und FieldB und FieldC und Sie müssen nicht Ihre ursprüngliche Vater Klasse A.

nun ändern, wenn Sie Methoden für eine Klasse erweitern möchten Sie auch gehen könnte mit statischen Erweiterungen wie folgt aus:

Public static void DoSomething(this A a) 
{ 
    ... 
} 

und rufen dann A.DoSomething();

+0

Wie wäre es, ich möchte keine Zwischenklasse erstellen !? Aus Gründen wie sowohl A als auch B sind meine Zugänglichkeit nicht erreichbar !? Alles, was ich hoffen könnte, ist, A zu erweitern, damit es ohne meine Einmischung laufen kann. Ist es möglich!? Vielen Dank!!! –

Verwandte Themen