Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#模板方法在抽象基类的具体类中重写_C#_Templates - Fatal编程技术网

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;
  }
}