C#模板方法在抽象基类的具体类中重写
我有下面的代码,它有一个C#模板方法在抽象基类的具体类中重写,c#,templates,C#,Templates,我有下面的代码,它有一个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 to
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;
}
}
类MyObj
{
私有字符串名称;
公共字符串名称{get;set;}
};
类MyObj2
{
私有字符串值
公共字符串值{get;set;}
}
抽象类基
{
公共抽象字符串toString(T);
公共无效剂量测定(T)
{
string myValue=toString您似乎试图为一个特定的类型参数提供一个实现。您不能这样做,而且这没有意义-不清楚如果调用方传入不同的类型参数会发生什么,例如
Base b = new MyClass2();
b.doSomething<int>(10);
此时,以前有问题的代码将不起作用,因为您需要使用Base
作为变量类型,而不仅仅是Base
,并且只能将MyObj
传递给DoSomething
(您可能还需要考虑将<代码> toSoist方法保护而不是公共的。这对于模板方法模式更为常见,虽然当然不是必需的。)如果你使用传统的名字,即使是.NET中的示例代码方法,也会用大写字母来称呼。“乔恩,我的坏,我主要是C++代码和C语言,对我来说是很新的,谢谢你的建议。谢谢你的建议,我已经走下这条路,现在一切都在起作用。-欢呼!
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;
}
}