私はキャッチ22に陥り、抜け道が見つからないようです。以下のサンプル コードの GetInstance メソッドで表される単純な [Service Locator][1] を実装しようとしています。ここでの問題は、return ステートメントで次のようなコンパイラ エラーが発生することです。
Cannot implicitly convert type 'Cyberspace.SubClass' to 'Cyberspace.BaseClass<T>'
SubClass 自体がジェネリック クラスになるように書き直そうとしましたが、DoSomething メソッドの return ステートメントでコンパイラ エラーが発生します。
GetInstace メソッドで抽象的な戻り値の型を持つことを可能にする Service Locator パターンの原則を保持したまま、このコードをコンパイルできる人はいますか? それとも、ここで不可能なことを達成しようとしていますか?
namespace Cyberspace
{
class BaseClass<T>
{
BaseClass<T> GetInstance()
{
return new SubClass();
}
virtual T DoSomething() { return default(T); }
}
class SubClass : BaseClass<OtherClass>
{
public override OtherClass DoSomething()
{
var other = new OtherClass { Description = "Generics are hard"};
return other;
}
}
class OtherClass
{
internal string Description { get; set; }
}
}
試行 2:
namespace Cyberspace
{
class BaseClass<T>
{
static BaseClass<T> GetInstance() // The "Service Locator" method
{
return new SubClass<T>();
}
internal virtual T DoSomething() { return default(T); }
}
class SubClass<T> : BaseClass<T> where T: OtherClass
{
internal override T DoSomething()
{
var other = new OtherClass { Description = "Generics are hard"};
return (T) other;
}
}
class OtherClass
{
internal string Description { get; set; }
}
}
これにより、オンラインで次のエラーが発生しますreturn new SubClass<T>();
The type 'T' cannot be used as type parameter 'T' in the generic type or method 'Cyberspace.SubClass<T>'. There is no boxing conversion or type parameter conversion from 'T' to 'Cyberspace.OtherClass'