我已經把自己變成了一隻漁獲22,似乎無法找到我的出路。我試圖實現一個簡單的[Service Locator] [1],由下面示例代碼中的GetInstance方法表示。現在的問題是我得到return語句一個編譯器錯誤說:如何使用泛型基類實現服務定位器模式?
Cannot implicitly convert type 'Cyberspace.SubClass' to 'Cyberspace.BaseClass<T>'
我試着重寫,這樣子類是一個通用類本身,但後來我得到的return語句編譯器錯誤DoSomething方法。
任何人都可以編譯此代碼,保留服務定位器模式的原則,它允許我在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'
有幾個選項。最簡單的方法是將'BaseClass GetInstance()'更改爲'BaseClass GetInstance()'。更復雜的涉及讓SubClass成爲泛型和/或強制約束泛型類型可以通過'where'子句。 http://msdn.microsoft.com/en-us/library/bb384067。aspx –
更改爲BaseClass GetInstance()將該方法鎖定爲僅該特定類。我想要一個通用的方法。我已經研究過使用where約束來通用子類,但是這會在DoSomething方法中產生問題() –
Nilzor