首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >抽象泛型与基类的非泛型重叠

抽象泛型与基类的非泛型重叠
EN

Stack Overflow用户
提问于 2022-03-01 10:44:18
回答 1查看 84关注 0票数 3

我有以下基类

非一般性:

代码语言:javascript
代码运行次数:0
运行
复制
public abstract class Foo
{
    public abstract bool DoMagic(string str1, string str2);
}

泛型类,从非泛型继承:

代码语言:javascript
代码运行次数:0
运行
复制
public abstract class Foo<T> : Foo
{
    public abstract bool DoMagic(T t1, T t2);
}

现在我想实现这个类

代码语言:javascript
代码运行次数:0
运行
复制
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

代码语言:javascript
代码运行次数:0
运行
复制
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

我试过几件事,但没有成功。

这个是可能的吗?

我知道的解决办法可以解决这个问题

  1. FooString上使用非泛型类。

不能这样做,因为Foo<T>包含更多的泛型方法,而且我只有一次重叠。

  1. 重命名该方法

如果可能的话,我想坚持这些名字。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-01 11:09:14

在我看来,接收泛型类型参数(DoMagic(T, T))的方法应该具有比接收具体类型(例如DoMagic(string, string))的相应方法更通用的名称。这不仅是因为你有一个句法冲突,而且你也有一个语义冲突,在某种意义上说,一般的概念和特定的概念有相同的名称。

这里有一个命名方案,其中一个更具体的方法(接收string)有一个更具体的名称,告诉它将使用字符串。

代码语言:javascript
代码运行次数:0
运行
复制
public class Foo<T>
{
    public bool DoMagic(T a, T b) { ... }
}

public class FooString : Foo<string>
{
    public bool DoMagicWith(string a, string b) { ... }
}

另一个命名方案是要注意,一般方法(接收泛型类型参数)执行的操作比任何具有具体参数类型的方法都具有更广泛的定义:

代码语言:javascript
代码运行次数:0
运行
复制
public class Foo<T>
{
    public bool DoAnyMagic(T a, T b) { ... }
}

public class FooString : Foo<string>
{
    public bool DoMagic(string a, string b) { ... }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71307242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档