[PHP-users 31284] Re: オーバーライドでのメソッドの拡張方法

yusuke ito ito.ysk @ gmail.com
2007年 1月 19日 (金) 12:02:28 JST


伊東です。

#オブジェクト指向に詳しい訳ではないですが

07/01/19 に Shindo<shindo @ atsystem.jp> さんは書きました:
> ただ、限定的とはいえPHP4の言語仕様にオブジェクト指向が含まれています
> ので、便利に使える限りは使いたいと思います。

継承を使うと、どの言語でも同様の挙動だと思いますよ。
#委譲とか使えればまた違うでしょうが

> >parentを呼ぶ時点で、呼び先のメソッドの内容は知っておく必要
> >がありますよね?
> そのメソッドの外部仕様のみ知っていれば良いのではないでしょうか。
> クラス外からメソッドを呼び出す時に知っていれば良いことと同じで十分だと思
> います。

クラス外から使うのと、継承した子クラス内から使うのとは根本的に違うと思います。

> >スーパーマーケットの店員が独自に処理を行ないたければ、parent
> >を呼ばずに処理を書けば良いだけです。
> はい。そうなのですが、処理の99%が八百屋クラスと同じだとしたら、八百屋
> クラスの店員メソッドを使いたいと思いませんか。

でも、それはスーパーマーケットに八百屋の店員が出てくる理由にはならないと思います。

> そうでなければ、同じソースをコピーペーストして2箇所に持つことになります。

同じ内容であれば、そもそもオーバーライドする必要がありません。

そもそもfoo::main()で
	echo "My name is foo::main.\n I am calling to foo::sub.\n";
	$this->sub();
て矛盾してませんか?foo::sub呼びたければ2行目はfoo::sub();とすればいいだけです。

あるいはどうしても親クラスをそのまま使いたければそのように書くだけです。

class bar extends foo
{
	var $parent; //紛らわしい名前だけど
	function bar() //コンストラクタ
	{
		$this->parent = new foo;
	}
	function main()
	{
		$this->parent->main();
	}
}

これなら『同じソースをコピーペースト』ではないですよね。


PHP-users メーリングリストの案内