2016-06-20 15 views
-1

Ich bin dabei, meinen Code zu faktorisieren. Ich habe eine Auto-Klasse als Basisklasse. Ausziehende Autoklasse sind SUV und Limousine. Möglicherweise werde ich viel mehr Arten von Autos hinzufügen müssen. Sie werden alle dieselbe Run-Methode haben. Ich frage mich, ob es möglich ist, die Run-Methode aus allen abgeleiteten Klassen zu entfernen und die Run-Methode in der Klasse Car beizubehalten, die auf die in den abgeleiteten Klassen erzeugte Zündung verweist. Unten ist der vereinfachte Code. Außerdem sollte die Zündung nur einmal erzeugt werden.Zugriff Unterklasse Methode und Attribut von Basisklasse

public abstract class Car 
{ 
    static Ignition ignition; 
    static void Start(){ ignition = A;} 
    public void Run(){ 
     using(ignition){ 
      Start{}; 
     } 
    } 
} 

public class Sedan : Car 
{ 
    static Ignition ignition; 
    static void Start(){ ignition = B;} 
    public void Run(){ 
     using(ignition){ 
      Start{}; 
     } 
    } 
} 

public class SUV : Car 
{ 
    static Ignition ignition; 
    static void Start(){ ignition = C;} 
    public void Run(){ 
     using(ignition){ 
      Start{}; 
     } 
    } 
} 
+1

Warum sind 'Ignition' und' 'Starten' static'? –

+2

Sie verwenden 'using' nicht, wie es entworfen wurde. 'using' wird im wesentlichen zu einem' try {new ignition(); } finally {ignition.Dispose(); } 'und' Ignition' (der zugrunde liegende Typ) müssen die IDisposable-Schnittstelle implementieren. Daher ist es schwer zu sagen, was Sie hier erreichen wollen. –

+0

Die Zündung ist statisch, weil ich versucht habe sicherzustellen, dass nur eine Instanz für alle Instanzen jedes Autotyps erstellt wird. – eriflame

Antwort

0

Sie brauchen nicht Run() in jeder abgeleiteten Klasse zu implementieren, und in der Tat würde ich argumentieren, Sie wollen nicht für dieses Beispiel. Jeder der abgeleiteten können ihre eigenen Ignition, groß, aber nur Run() von nur auf Ihrer Basisklasse bieten.

Gibt es auch einen Grund Ignition ist statisch, statt der Basis Car Klasse während des Baus gegeben? Dies würde Ihnen wahrscheinlich erlauben, Ihre Start() Methode zu entfernen.

2

Ich frage mich, ob es möglich ist, Run-Methode von allen abgeleiteten Klassen zu entfernen, und halte Run-Methode in Car-Klasse, die die Zündung in abgeleiteten Klassen erstellt Referenz

Ja, aber nur, wenn Sie loswerden der static Methoden und Eigenschaften. Wenn Sie machen sie Instanz Methoden und Eigenschaften dann werden sie vererbt werden, und Sie können Start virtuelle machen:

public abstract class Car 
{ 
    protected Ignition ignition {get; set;} 
    virtual void Start(){ ignition = A;} 
    public void Run(){ 
      Start(); 
    } 
} 

public class Sedan : Car 
{ 
    override void Start(){ ignition = B;} 
} 

public class SUV : Car 
{ 
    override void Start(){ ignition = C;} 
} 
Verwandte Themen