Out of Memory

本ブログは更新を停止しました。Aerieをよろしくお願いいたします。

目次

Blog 利用状況

ニュース

2009年3月31日
更新を停止しました。引き続きAerieを御愛顧くださいませ。
2009年2月3日
原則としてコメント受付を停止しました。コメントはAerieまでお願いいたします。
詳細は2月3日のエントリをご覧ください。
2008年7月1日
Microsoft MVP for Developer Tools - Visual C++ を再受賞しました。
2008年2月某日
MVPアワードがVisual C++に変更になりました。
2007年10月23日
blogタイトルを変更しました。
2007年7月1日
Microsoft MVP for Windows - SDKを受賞しました!
2007年6月20日
スキル「ニュース欄ハック」を覚えた!
2006年12月14日
記念すべき初エントリ
2006年12月3日
わんくま同盟に加盟しました。

カレンダー

中の人

αετο? / aetos / あえとす

シャノン? 誰それ。

顔写真

埼玉を馬鹿にする奴は俺が許さん。

基本的に知ったかぶり。興味を持った技術に手を出して、ちょっと齧りはするものの、それを応用して何か形にするまでは及ばずに飽きて放り出す人。

書庫

日記カテゴリ

アンケート:共変オーバーライド

ご意見頂戴。
こういうオーバーライドはできたらいいと思う?


class X;
class Y : X;
class Base
{
    public virtual void Hoge( X x );
}
class Derived : Base
{
    public override void Hoge( Y y );
}

投稿日時 : 2007年2月14日 12:39

Feedback

# re: アンケート:共変オーバーライド 2007/02/14 13:00 黒龍

オーバライドじゃなくてオーバロードになっちゃうぞっと。ってことで機能的にはあるので無問題。
void Hoge( X x );側が隠れるとOOPとして成り立たないからメリットが見えないっす。

# re: アンケート:共変オーバーライド 2007/02/14 13:34 シャノン

「できたらいいと思う?」な話なので、C#によく似た架空言語だと思ってください。よってオーバーロードにはならず。

例えば、XとBaseは常にセットで使うこと、かつ、それぞれが派生クラスで拡張されることを意図して設計されているとする(Derived.Hogeの引数は常にYであることがわかっているとする)。
C#で同じことをやろうとすると、Derived.Hogeの引数はXでなければならないが、そこに渡される型は常にYなのでキャストが必要になる。
Hoge(X)をHoge(Y)でオーバーライドできればキャストが要らなくなるというメリットがある。
代償として、Base.Hogeの宣言だけを見ても引数に何を渡せばいいか分からなくなるというデメリットがある。
が、これはC#でも存在する問題で、Derived.Hogeの中でキャストしているのでどのみち落ちる。
それとも、こういう場合のDerived.Hogeは、引数がYでないことも想定してプログラムを組まなければならないのだろうか?

# re: アンケート:共変オーバーライド 2007/02/15 10:10 επιστημη

んとんと、

Base object = new Derived();
X argument = new X();
object.Hoge(argument);
こんとき Derived.Hoge が呼ばれるけども
引数は本来のYじゃなくXが引き渡されますな...ヤバいっすよねー

引数X,Yの継承関係が逆転していれば、Yの方がより'狭い'ので問題なさげですけども。

# re: アンケート:共変オーバーライド 2007/02/15 11:17 シャノン

> ヤバいっすよねー

うん、それがヤバいのは承知の上。
けれど、Derived.Hoge が引数に Y を期待して、

public override void Hoge( X x )
{
 Y y = ( Y )x;
 // ...
}

ってやってると、それはそれで落ちる。
どちらにせよ、Base.Hoge の宣言だけからは、引数に渡すべき正確な型がわからない以上、キャストが要らないだけマシかな、と。
「宣言上は X を取るのに、実際には Y しか取れない」という Derived.Hoge の設計がマズい気もする。
すると、そもそもからして、

> 例えば、XとBaseは常にセットで使うこと、かつ、それぞれが派生クラスで拡張されることを意図して設計されているとする

という設計がまずい?
こういう場合のいい方法はありますかね?

# re: アンケート:共変オーバーライド 2007/02/15 22:30 黒龍

なるほどBaseとして使われるんですな。
そうなるとキャストじゃなくオーバライド側で引数チェックでしょうねぇ。is or AssignableでダメならArgumentExceptionを投げると。

# re: アンケート:共変オーバーライド 2007/02/16 12:06 シャノン

> そうなるとキャストじゃなくオーバライド側で引数チェックでしょうねぇ。is or AssignableでダメならArgumentExceptionを投げると。

うむ。
で、そういう設計ってどうなのよ? と。それって LSP の破壊だよねと。
どうせ破壊するなら、キャストない方がいいんじゃない? と。

ただ、そこで、こういうオーバーライドができた方が嬉しいという結論に達したとしても、C#がそうなる望みはないので、それは一旦忘れるとする。

ちょっと考えを変えて、LSPを破壊しない設計を考えると、どういう風にするのがいいのかな。

タイトル
名前
Url
コメント