2017-03-20 9 views
0

私はこのコードを持っている現在のクラスからメソッドの実装を呼び出す方法は?

class Base 
{ 
    public function greet() 
    { 
     print "hello"; 
    } 

    public function speak() 
    { 
     $this->greet(); 
    } 
} 

class Extension extends Base 
{ 
    public function greet() 
    { 
     print "goodbye"; 
    } 
} 

ようなクラスのようなクラスを持っている:

$extension = new Extension(); 

//Situation One 
$extension->speak(); //This says goodbye 

//Situation Two 
$extension->greet(); //This says goodbye 

私は状況の一つは、挨拶したいです。私は状況2が別れを告げるのに満足しています。

Baseのgreet()の実装を使用する必要があることを示すために(おそらくspeak()の実装で)できることはありますか?

(言い換えれば、ベースは拡張クラスは挨拶()が、話す()の呼び出しは、それがベースに定義されている既知の動作を使用したい)(挨拶するとき、未知のない行動が他の場所で定義されたを上書きするのは幸せです。)

+0

すべてが良いのですが、それはPHPではありません。 useドル '$' USドル – C2486

+0

@Nikleshありがとう、最近PHPとJSの切り替えが多すぎる – cja

答えて

0

異なる状況で異なる機能が必要なので、2つのクラス実装を作成します。

class Base 
{ 
    public function greet() 
    { 
     print NULL; 
    } 

    public function speak() 
    { 
     this->greet(); 
    } 
} 

class Goodbye extends Base 
{ 
    public function greet() 
    { 
     print "goodbye"; 
    } 
} 

class Hello extends Base 
{ 
    public function greet() 
    { 
     print "hello"; 
    } 
} 

1つのシナリオ。

$hello = new Hello(); 
$hello->greet(); 

別のシナリオ。

$goodbye = new Goodbye(); 
$goodby->greet(); 
0

これは、自分自身をインターフェイスに紹介するのに最適なシナリオです。この特定のケースでは、次のインターフェイスが必要になります:

interface MyClassInterface 
{ 
    public function greet(); 

    public function speak(); 
} 

は、単にあなたがそれを上書きしたくない場合は発言メソッド内挨拶呼び出すことはありません:

abstract class Base 
{ 
    public function speak() 
    { 
     print "hello"; 
    } 
} 

class Extension extends Base implements MyClassInterface 
{ 
    public function greet() 
    { 
     print "goodbye"; 
    } 
} 

$extension = new Extension(); 

// Situation One 
$extension->speak(); // This says hello 

// Situation Two 
$extension->greet(); // This says goodbye 
+0

Extensionはspeak()を実装していないので、MyClassInterfaceを実装していませんか? – cja

+0

speak()を実装するBaseクラスを拡張します。 –

関連する問題