gpt4 book ai didi

C# 等价于 Java 的 GenericType

转载 作者:太空狗 更新时间:2023-10-29 21:54:15 25 4
gpt4 key购买 nike

我正在使用 C# 中的一些泛型。我有一个抽象泛型类:

public abstract class BaseClass<T> where T : Foo { }

其他类继承基类时指定类型参数。

我也在尝试为另一个需要存储这些基类之一的抽象类编写一些代码,但它不会知道基类的参数(而且它不需要知道)。在 Java 中我可以简单地写:

protected BaseClass<?> myBaseClass;

但在 C# 中,它坚持要我给它一个类型参数。如果我将其声明为:

protected BaseClass<Foo> myBaseClass;

我无法分配 BaseClass 的任何参数化值

是否有解决方法来实现 BaseClass<?> 的效果?在 C# 中?显然有一些方法可以重构我的代码以避免这种需要,例如参数化所有使用 BaseClass 的类。也一样,但这不太理想。任何帮助将不胜感激!

最佳答案

为了在某种程度上与 C# 中的 Java 行为相匹配,通常在继承层次结构中放置一个额外的非泛型接口(interface)。

public interface IBaseClass
{
Foo GetValue();

void SetValue(Foo value);
}

public abstract class BaseClass<T> : IBaseClass
where T : Foo
{
public T GetValue<T>()
{ /* ... */ }

public void SetValue<T>(T value)
{ /* ... */ }

Foo IBaseClass.GetValue() // Explicit interface method implementation
{
return (Foo)GetValue<T>();
}

void IBaseClass.SetValue(Foo value) // Explicit interface method impl.
{
SetValue<T>((T)value);
}
}

然后使用IBaseClass你需要的地方BaseClass<?> :

IBaseClass myClass;
Foo f = myClass.GetValue();

关于C# 等价于 Java 的 GenericType<?>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21142571/

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