gpt4 book ai didi

c# - 从非泛型类覆盖抽象泛型方法

转载 作者:太空狗 更新时间:2023-10-29 20:57:07 24 4
gpt4 key购买 nike

基类

class Drawer
{
public abstract void Draw<T>(T type);
}

派生类#1

class ADrawer : Drawer
{
public override void Draw<T>(List<T> list)
{
foreach (var a in list)
{
DrawA(a);
}
}

public void DrawA(Agent a)
{
//draw code here
}
}

派生类 #2

class AnotherDrawer : Drawer
{
public override void Draw<T>(T number)
{
if (number == 1)
{
//draw code
}
}
}

错误在#1 派生类中:“找不到合适的方法来覆盖”

我是否应该在基类中使用“虚拟”以及“抽象”?

我应该如何设置基参数类型以允许派生类中的各种参数?

最佳答案

您的代码存在的问题比您询问的问题更多。暂时搁置覆盖问题,类 ADrawer 需要一个类型约束(where T : Agent):

class ADrawer : Drawer 
{
public void Draw<T>(List<T> list) where T : Agent
{
foreach (var a in list)
{
DrawA(a);
}
}
public void DrawA(Agent a)
{
//draw code here
}
}

如果没有这个约束,通过 a 是不合法的至 DrawA ,因为 aT 类型的引用, 并且没有约束就没有类型 T 的隐式转换输入 Agent .

AnotherDrawer 类非法使用了 ==运算符(operator)。无法应用 == T 类型操作数的运算符和 int .您可以使用 object.Equals 来解决这个问题覆盖。

最后,基类出现错误,因为它是一个包含抽象成员的非抽象类。

但是,一般来说,这段代码表明应该是通用的,而不是方法:

abstract class Drawer<T>
{
public abstract void Draw(T type);
}

派生类 #1

class ADrawer : Drawer<List<Agent>>
{
public override void Draw(List<Agent> list)
{
foreach (var a in list)
{
DrawA(a);
}
}

public void DrawA(Agent a)
{
//draw code here
}
}

派生类#2

class AnotherDrawer : Drawer<int>
{
public override void Draw(int number)
{
if (number == 1)
{
//draw code
}
}
}

为了跟进 Eric Lippert 的评论(这也是我对您的问题的第一 react ),您可以考虑改用这种设计:

abstract class Drawer<T>
{
public abstract void Draw(T type);
public void DrawMany(IEnumerable<T> types)
{
foreach (var t in types)
Draw(t);
}
}

派生类 #1

class ADrawer : Drawer<Agent>
{
public override void DrawA(Agent a)
{
//draw code here
}
}

派生类 #2 未更改。

关于c# - 从非泛型类覆盖抽象泛型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9197384/

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