簡體   English   中英

從抽象基類的具體類中重寫C#模板方法

[英]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;
  }
}

但是編譯器不喜歡MyClassMyClass2toString()的實現,它給出以下錯誤消息:

'MyObj'不包含'Name'的定義,找不到可以接受類型為'MyObj'的第一個參數的擴展方法'MyObj'(您是否缺少using指令或程序集引用?)

您似乎正在嘗試為一種特定類型的參數提供實現。 您無法做到這一點,而且沒有任何意義-不清楚如果調用方傳入其他類型的參數(例如,

Base b = new MyClass2();
b.doSomething<int>(10);

(目前,方法中的MyObjMyObj2被視為類型參數,而不是類型本身,這就是為什么編譯器對NameValue屬性一無所知的原因。)

聽起來確實應該是泛型的

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM