インスパイア元 → IListとList
ちょっとしたことが気になって試してみた。
まず C++:
#include <iostream>
using namespace std;
class Base {
public:
virtual Base* me()
{ cout << "Base::me()\n"; return this; }
};
class Derived : public Base {
public:
virtual Derived* me()
{ cout << "Derived::me()\n"; return this; }
};
int main() {
Base* p = new Derived();
Base* r = p->me();
if ( dynamic_cast<Derived*>(r) ) {
cout << "Derived returned.\n";
}
}
Base.me() と Derived.me() は戻り値の型が一致しません。
でも呑んでくれます。DerivedはBaseから導出されてんで
Derived*はBase*と看做してもえぇからです。
次いでC#
using System;
class Base {
public virtual Base me()
{ Console.WriteLine("Base.me()"); return this; }
}
class Derived : Base {
public override Derived me()
{ Console.WriteLine("Derived.me()"); return this; }
}
class Program {
static void Main() {
Base p = new Derived();
Base r = p.me();
if ( r is Derived ) {
Console.WriteLine("Derived returned.");
}
}
}
ダメっすね。
error CS0508: 'Derived.me()': オーバーライドされたメンバ
'Base.me()' に対応するために戻り値の型は 'Base' でなければなりません
カタいことゆーなよおーーー
※ ちょい昔はC++でもダメでした。シグニチャに完全一致が求められました。