![](/img/trans.png)
[英]C#, Using self as a parameter for an abstract override method of the base class
[英]C# Template method override in concrete class from abstract base class
我有以下代碼,其中的Base
類包含抽象模板方法,該類在派生類中使用具體類型覆蓋。
class MyObj
{
private string name;
public string Name { get; set; }
};
class MyObj2
{
private string value
public string Value { get; set; }
}
abstract class Base
{
public abstract string toString<T>(T t);
public void doSomething<T>(T t)
{
string myValue = toString<T)(t);
...
}
};
class MyClass : Base
{
public override string toString<MyObj>(MyObj o)
{
return o.Name;
}
}
class MyClass2 : Base
{
public override string toString<MyObj2>(MyObj2 o)
{
return o.Value;
}
}
但是編譯器不喜歡MyClass
或MyClass2
中toString()
的實現,它給出以下錯誤消息:
'MyObj'不包含'Name'的定義,找不到可以接受類型為'MyObj'的第一個參數的擴展方法'MyObj'(您是否缺少using指令或程序集引用?)
您似乎正在嘗試為一種特定類型的參數提供實現。 您無法做到這一點,而且沒有任何意義-不清楚如果調用方傳入其他類型的參數(例如,
Base b = new MyClass2();
b.doSomething<int>(10);
(目前,方法中的MyObj
和MyObj2
被視為類型參數,而不是類型本身,這就是為什么編譯器對Name
或Value
屬性一無所知的原因。)
聽起來確實應該是泛型的類 :
abstract class Base<T>
{
public abstract string ToString(T t);
public void DoSomething(T t)
{
string myValue = ToString(t);
...
}
}
class MyClass : Base<MyObj>
{
public override string ToString(MyObj o)
{
return o.Name;
}
}
class MyClass2 : Base<MyObj2>
{
public override string ToString(MyObj2 o)
{
return o.Value;
}
}
在這一點上,以前有問題的代碼將無法工作,因為您將使用Base<MyObj2>
作為變量類型,而不是僅使用Base
,並且只能將MyObj
傳遞給DoSomething
。
(您可能還想考慮將ToString
方法設置為受保護的而不是公共的。這對於模板方法模式更為常見,盡管當然不是必需的。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.