2016-05-22 5 views
-4

Unten ist ein Beispiel, das den Vorteil der Zusammensetzung gegenüber Vererbung zeigt. Alles, was ich nicht verstehe, ist der Code in der Klasse Testbus. Das istWie ist es möglich, ein "neues" als Parameter in einem anderen neuen zu verwenden?

new Bus(new PrototypeEngine1()).drive(); 

Ich bin nicht vertraut mit dem oben genannten Stil des Codes. Wie ist es möglich, ein "neues" als Parameter in einem anderen neuen zu verwenden? Was ist diese Art von übergebenen Parameter oder Argument? Gibt es einen Namen dafür?

Unten ist der vollständige Kontext, dem ich folgte, bis ich auf "TestBus" Klasse stieß.

Es gibt eine Klassenengine mit einer Methodenmethode start(). Es gibt eine andere Klasse Bus es hat eine Methode Laufwerk().

//dummy class or prototype class for actual engine 

class PrototypeEngine1{ 

public boolean start(){ 
    // do smething 
return true; 
} 
} 

class Bus extends PrototypeEngine1 { 
public void drive(){ 
boolean isStarted = false 
boolean isStarted = super.start(); 

if(isStarted == true) { 
// do something 
}else { 
    // do something 
} 
} 
} 

Erstellen von Buss-Klasse, die in ihm einen Verweis von Motor hat

class Bus { 
    private Engine engine; 
    public Bus (Engine engine) 
    { 
     this.engine = engine; 
} 

    public void drive(){ 

    boolean isStarted = false; 
    isStarted = engine.start(); 
    if(isStarted == true) { 
    // do something 
    }else { 
     // do something 
    } 
    } 
} 

class TestBus{ 
public void testDrive(){ 
    new Bus(new PrototypeEngine1()).drive(); 
} 
} 
+0

Der Code, den Sie gepostet haben, wird nicht kompiliert, da in 'new Bus (new PrototypeEngine1(). Drive())' '' PrototypEngine1' keine 'drive'-Methode hat. Meintest du 'neuer Bus (new PrototypeEngine1()). Drive()'? Außerdem vermute ich, dass Ihre erste 'Bus'-Klasse eine' StandardEngine' oder etwas ähnliches sein soll. Bitte zeigen Sie eine [mcve] an, die tatsächlich kompiliert wird (und richtig formatiert ist). –

+0

Ihre Klassen sind nicht klar. Wie auch immer ... Sie können hier einen neuen Operator verwenden, da dieser nur zum Erstellen des Objekts verwendet wird. Sie können zuerst das PrototypEngine1-Objekt erstellen und einer Variablen zuweisen und diese Variable in einem neuen Bus (..) verwenden. Es wird nur eine neue Instanz von PrototypEngine übergeben, die der Bus-Konstruktor als Parameter für seine Operationen verwendet. –

+0

Bitte um Gottes Willen fügen Sie einen aussagekräftigen Titel für diese Frage hinzu. –

Antwort

0

Der new Operator verwendet wird, eine Instanz einer Klasse zu erstellen. Was in new Bus(new PrototypeEngine1()).drive() passiert, ist, dass eine Instanz von PrototypeEngine1 als ein Argument zu new Bus() erstellt wird.

dieses Konzept zu veranschaulichen, lassen Sie sich die einzige Zeile Code in Schritt für Schritt Weise Refactoring:

PrototypeEngine1 engine = new PrototypeEngine1(); 
Bus bus = new Bus(engine); 
bus.drive(); 

Diese Zeilen Code zu dieser ursprünglichen Codezeile praktisch gleichwertig sind.

0

Sie neue Instanzen innerhalb eines neuen Instanz-Erstellung (Konstruktor Aufruf) erstellen können. Es gibt keinen Unterschied, als eine neue Variable zu erstellen und sie bis auf Lesbarkeit zu übergeben.

0
new Bus(new PrototypeEngine1().drive()); 
  1. neue PrototypeEngine1() -> Ein neues Objekt von PrototypeEngine1() erstellt

  2. neuen PrototypeEngine1() fahren (.) -> Call-Methode Laufwerk in PrototypeEngine1 Klasse für meinen erstellt Objekt

  3. neuer Bus (new PrototypeEngine1(). drive()) -> Erstellen Sie eine neue Instanz von Bus.Senden Sie den Rückgabewert von 2 an, der von einem Konstruktor in Bus verwendet werden soll.

Auch wird Ihr Code nicht kompilieren, da Laufwerk() -Methode nicht, dass es in PrototypeEngine1 Klasse

Verwandte Themen