我遇到了一個我無法弄清楚的問題。我有一個提供方法簽名的接口。這個方法接受一個字符串,並返回一個布爾值。C#如何避免泛型將<T>方法推入與非泛型方法的簽名衝突?
該接口然後由一個抽象類實現,該類使用泛型類型T參數來定義接口函數的重載版本。這個重載的方法需要一個T並返回一個布爾值。同樣,接口方法被抽象出來以便由具體類而不是抽象實現來實現。
當具體類爲字符串T提供一個字符串時,我遇到了一個問題,因爲它似乎會導致接口方法簽名和抽象方法簽名之間的某種衝突。我試着尋找解決方案,但是我的谷歌搜索失敗了。
我編譯時收到以下錯誤消息:
錯誤2 'FooBarTest1.StringFoo' 不實現繼承抽象構件 'FooBarTest1.AFoo.Bar(字符串)' 的Program.cs 41 18 ConsoleApplication1
錯誤3繼承的成員'FooBarTest1.AFoo.Bar(string)'和'FooBarTest1.AFoo.Bar(T)'在'FooBarTest1.StringFoo'類型中具有相同的簽名,因此它們不能被重寫ConsoleApplication1 \ Program.cs 43 30 ConsoleApplication1
除了改變一個方法名稱之外,還有一個簡單的方法嗎? (示例代碼如下)
namespace FooBarTest1
{
public class Program
{
static void Main(string[] args)
{
Foo f = new Foo();
}
}
public interface IFoo
{
bool Bar(string foo);
}
public abstract class AFoo<T> : IFoo
{
public abstract bool Bar(string foo);
public abstract bool Bar(T foo);
}
public class IntFoo : AFoo<int>
{
public override bool Bar(string foo)
{
return true;
}
public override bool Bar(int foo)
{
return Bar(foo.ToString());
}
}
public class StringFoo : AFoo<string>
{
public override bool Bar(string foo)
{
return true;
}
}
}
我肯定會改變方法的名字之一 - 如果沒有其他的清晰度。如果某人*創建了一個'AFoo',並且他們調用Bar(「hello」)',那麼您希望它綁定哪個重載?他們會期待同樣的行爲嗎?如果您重新命名一種避免碰撞的方法,生活會更簡單。 –
2014-10-16 21:58:54