我让自己陷入了 22 条陷阱,似乎找不到出路。我正在尝试实现一个简单的 [Service Locator][1],由下面示例代码中的 GetInstance 方法表示。现在的问题是我在 return 语句上得到一个编译器错误,说:
Cannot implicitly convert type 'Cyberspace.SubClass' to 'Cyberspace.BaseClass<T>'
我已经尝试重写,以便 SubClass 本身就是一个泛型类,但随后我在 DoSomething 方法中的 return 语句上得到编译器错误。
任何人都可以编译此代码,保留允许我在 GetInstace 方法中具有抽象返回类型的服务定位器模式原则吗?还是我想在这里实现一些不可能的事情?
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'