[英]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.