2017-09-14 18 views
0

ここに私のコードです。私は経験していないので、簡単な言葉で答えを教えてください。PHPクラスのコンストラクタをオーバーライドするにはどうすればよいですか?

<?php 
function println($message) { 
    echo "\n".$message; 
} 

printlnはエコーですが、メッセージの前に¥nが付いています。私は単にPython 3に慣れていますが、print()は使用できません。

class Car { 
    public function __construct($name) { 
    //If the constructor is that of a car, it will be said that a car was made. 

     println("Car made!"); 
     $this->distance_drived = 0; 
     $this->name = $name; 
    } 
    function introductory() { 
     return "This car is called ".$this->name."."; 
    } 
} 

class Battery { 
    function __construct($max_capacity, $current_capacity) { 
     echo "Constructed!"; 
     $this->max_capacity = $max_capacity; 
     $this->current_capacity = $current_capacity; 
    } 
    function fill($amount) { 
     if ($amount + $this->current_capacity >= $this->max_capacity) { 
      $this->fill_full(); 
     } else { 
      $this->current_capacity += $amount; 
     } 
    } 
    function fill_full() { 
     $this->current_capacity = $this->max_capacity; 
    } 
    function use_power($amount) { 
     if ($amount + $this->current_capacity >= $this->max_capacity) { 
      return $this->current_capacity; 
      $this->current_capacity = 0; 
     } else { 
      $this->current_capacity -= $amount; 
      return $amount; 
     } 
    } 
    function check_percentage() { 
     return ($this->current_capacity/$this->max_capacity) * 100; 
    } 
} 

class ElectricCar extends Car { 
    public function __construct($name, $max_capacity, $current_capacity, $power_per_km) { 
     println("Electric car made!"); 

     //If the constructor is that of an electric car, it will be said that a car was made. 

     $this->distance_drived = 0; 
     $this->name = $name; 
     println($max_capacity); 
     $this->battery = new Battery($max_capacity, $current_capacity); 
    } 
    public function move($km) { 
     $power_required = $km * $this->power_per_km; 
     $used = $battery->use_power($power_required); 
     $this->distance_drived += $used/$this->power_per_km; 
    } 
} 

$toyota = new Car("Toyota 2017"); 
println($toyota->name); 
println($toyota->introductory()); 
$tesla = new Car("Tesla Model S", 1000, 750, 5); 
println($tesla->introductory()); 
println("Capacity is ".$tesla->battery->max_capacity); 

?> 

私の主な問題は、メッセージがElectricCarのCarのメッセージのままであるため、__construct()が変更されなかったことです。

+0

親のコンストラクタを呼び出すことです"、1000、750、5);'その後、少なくとも$ teslaオブジェクトをインスタンス化する正しいクラスを使用します – RiggsFolly

+0

これをTYPOとして閉じることをお勧めします – RiggsFolly

答えて

4

あなたの問題は、この行である:

$tesla = new Car("Tesla Model S", 1000, 750, 5); 

あなたはElectricCarを作成しようとしたことがありません。その行を

$tesla = new ElectricCar("Tesla Model S", 1000, 750, 5); 

に変更して、すべてが期待どおりに動作するはずです。

1

実際に、子クラスに新しいコンストラクタを作成するだけで、親コンストラクタをオーバーライドしています。コンストラクタを書き換えないと、親コンストラクタが呼び出されます。

あなたのコードからは、ElectricCarではなく、Teslaを車として作成しているのがわかります。そのため、ElectricCarメッセージの代わりにCarメッセージが表示されます。

あなたは親クラスのコンストラクタを拡張するためにあなたの子クラスのコンストラクタをしたい場合はFYI、何をしなければならないことは、 `=新ElectricCar(「テスラモデルS $のテスラを試してみてください。この方法

parent::__construct(); 
関連する問題