我有以下基类
非一般性:
public abstract class Foo
{
public abstract bool DoMagic(string str1, string str2);
}
泛型类,从非泛型继承:
public abstract class Foo<T> : Foo
{
public abstract bool DoMagic(T t1, T t2);
}
现在我想实现这个类
public class FooNumeric : Foo<int>
{
public override bool DoMagic(string str1, string str2) => true;
public override bool DoMagic(int int1, int int2) => true;
}
正如您在这里所看到的那样,所有的事情都是例外的:
https://dotnetfiddle.net/kWQUl9
现在,我不想使用int
作为泛型约束,而是使用string
。
public class FooString : Foo<string>
{
public override bool DoMagic(string str1, string str2) => true;
//public override bool DoMagic(string int1, string int2) => true;
}
但是我似乎不能满足编译器的要求,而且我不断地得到错误
'FooString‘不实现继承的抽象成员’Foo.DoMagic(字符串,字符串)‘
https://dotnetfiddle.net/rfncTE
我试过几件事,但没有成功。
这个是可能的吗?
我知道的解决办法可以解决这个问题
FooString
上使用非泛型类。不能这样做,因为Foo<T>
包含更多的泛型方法,而且我只有一次重叠。
如果可能的话,我想坚持这些名字。
发布于 2022-03-01 03:09:14
在我看来,接收泛型类型参数(DoMagic(T, T)
)的方法应该具有比接收具体类型(例如DoMagic(string, string)
)的相应方法更通用的名称。这不仅是因为你有一个句法冲突,而且你也有一个语义冲突,在某种意义上说,一般的概念和特定的概念有相同的名称。
这里有一个命名方案,其中一个更具体的方法(接收string
)有一个更具体的名称,告诉它将使用字符串。
public class Foo<T>
{
public bool DoMagic(T a, T b) { ... }
}
public class FooString : Foo<string>
{
public bool DoMagicWith(string a, string b) { ... }
}
另一个命名方案是要注意,一般方法(接收泛型类型参数)执行的操作比任何具有具体参数类型的方法都具有更广泛的定义:
public class Foo<T>
{
public bool DoAnyMagic(T a, T b) { ... }
}
public class FooString : Foo<string>
{
public bool DoMagic(string a, string b) { ... }
}
https://stackoverflow.com/questions/71307242
复制