gpt4 book ai didi

c# - 继承通用抽象

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:37 25 4
gpt4 key购买 nike

我不确定这是否可行,希望得到一些说明。

我有一个这样的类结构:

public class FooBase
{
//Some base class
}

public class BarBase
{
//Some base class
}

public class Foo : FooBase
{
//Implementation
}

public class Bar : BarBase
{
//Implementation
}

public abstract class FooBarHolderAbstract<T, V> where T: FooBase where V: BarBase
{
}

public class MyFooBarHolderImpl : FooBarHolderAbstract<Foo, Bar>
{
}

public class FooBarTest
{
public void DoSomethingWithFooBar<T>() where T : FooBarHolderAbstract<FooBase, BarBase>
{
//Do something tith the obj
}

public void RunTest()
{
//This doesn't work, compiler says MyFooBarHolder is not convertible to FooBarHolderAbstract<FooBase, BarBase>
DoSomethingWithFooBar<MyFooBarHolderImpl>();
}
}

在 FooBarTest 类中,我想创建一个接受泛型参数的方法,该方法继承自具有两个泛型参数的抽象类。类 MyFooBarHolderImpl 扩展了抽象基类,并使用从抽象类的通用参数类型继承的类型指定其通用参数。

当我尝试调用此方法 (DoSomethingWithFooBar()) 时,编译器告诉我 MyFooBarHolderImpl 类型必须可转换为 FooBarHolderAbstract

这是根本无法完成的事情,还是我缺少概念/语法?

提前致谢!

最佳答案

嗯,这不能直接完成 - FooBarHolderAbstract<Foo, Bar> 不是 FooBarHolderAbstract<FooBase, BarBase> .不清楚您是否可以逻辑上拥有它,因为我们不知道抽象类中有什么。

您基本上是在寻找 generic covariance , 但无论如何类都不支持 - 所以你可能想引入一个接口(interface):

public interface IFooBarHolder<out T, out V>
where T: FooBase
where V: BarBase
{
// Define what you need in here
}

public abstract class FooBarHolderAbstract<T, V> : IFooBarHolder<T, V>
where T : FooBase
where V : BarBase
{

}

此时,您可以更改 FooBarTest到:

public void DoSomethingWithFooBar<T>() where T : IFooBarHolder<FooBase, BarBase>
{
//Do something with the obj
}

... 因为 IFooBarHolder<Foo, Bar> 一个IFooBarHolder<FooBase, BarBase> .

但是,这仅在您可以为使用 T 的接口(interface)定义所有操作时才有效。和 V在“出局”的位置,例如从方法返回类型。如果您需要将它们置于“输入”位置,例如作为方法参数,你被卡住了——因为一个方法需要一个 Foo无法处理任何其他类型的 FooBase .

关于c# - 继承通用抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33034154/

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