gpt4 book ai didi

c# - 抽象泛型与基类的非泛型重叠

转载 作者:行者123 更新时间:2023-12-05 05:45:36 26 4
gpt4 key购买 nike

我有以下基类

非泛型:

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' does not implement inherited abstract member 'Foo.DoMagic(string, string)'

https://dotnetfiddle.net/rfncTE

我尝试了一些事情,但没有成功。

这可能吗?

我知道可以解决这个问题的解决方案

  1. FooString 上使用非泛型类

    不能这样做因为 Foo<T>包含更多通用方法,我只有一次重叠。

  2. 重命名方法

    如果可能的话,我想坚持使用名称。

最佳答案

在我看来,接收通用类型参数的方法 (DoMagic(T, T)) 应该比相应的接收具体类型的方法(例如 DoMagic(字符串,字符串))。这不仅是句法冲突,而且在一般概念和特定概念共享相同名称的意义上,您还存在语义冲突。

这是一个命名方案,其中一个更具体的方法(接收 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) { ... }
}

关于c# - 抽象泛型与基类的非泛型重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71307242/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com