嵌套泛型的继承/抽象类C#中的嵌套泛型

问题描述 投票:2回答:2

我有两个可以显式使用的抽象类:A_GUI_Info和A_Info_Data。 GUI_Infos是显示数据的GUI元素。 Info_Datas是数据类,用于将特定数据传输到相应的GUI_Info。

我想通过泛型表示一个显式GUI_Info具有一个显式Info_Data的依赖性,并且仍然允许继承。换句话说,我想避免将错误的显式Info_Data馈送到显式GUI_Info。例如,我将HUD_Info_Data馈送到Wrist_GUI_Element,而Wrist_GUI_Element没有办法表示它。 >一种继承的泛型的类型安全性

示例:

class HUDInfoData : A_Info_Data
class HUDInfo<HUDInfoData > : A_GUI_Info<A_Info_Data> 
// but the generic cant be inherited like that

class HUDInfo : A_GUI_Info<A_Info_Data>
// doesnt define dependency

class HUDInfo : A_GUI_Info<HUDInfoData >
// also not working

另一种方法是通过where T : A_GUI_Info<D> where D : A_Info_Data进行限制,但它并非那样工作。

c# generics abstract
2个回答
0
投票

您是否尝试过:

abstract class A_Info_Data { ... }
abstract class A_GUI_Info<T> where T: A_Info_Data { ... }

现在:

class CriticalData: A_Info_Data { ... }
class CriticalGui: A_GUI_Info<CriticalData> { ... }

0
投票

基类上的type参数仅存在于基类上。派生更多的类必须定义一个新的类型参数,并将该类型通过管道传递给基类的类型参数。这为您提供了更多通用约束的地方。

例如:

class HUDInfo<THudInfoData> : A_GUI_Info<THudInfoData> where THudInfoData : A_Info_Data

现在,HUDInfo<>可以取任何HudInfoData,只要它是从A_Info_Data派生的(或者如果它是[[is A_Info_Data))。如果您希望只包含HUDExtremelySpecificInfoHUDExtremelySpecificInfoData,则如下所示:

class HUDExtremelySpecificInfo<THudInfoData> : A_GUI_Info<THudInfoData> where THudInfoData : HUDExtremelySpecificInfoData
如果您永远都不希望指定类型,因为您知道它始终是HUDExtremelySpecificInfoData,那么您也可以同时声明两者:

class HUDExtremelySpecificInfo<THudInfoData> : A_GUI_Info<THudInfoData> where THudInfoData : HUDExtremelySpecificInfoData { .. } class HUDExtremelySpecificInfo : HUDExtremelySpecificInfo<HUDExtremelySpecificInfoData> { .. }

((根据通用HUDExtremelySpecificInfo实现非通用HUDExtremelySpecificInfo<>的地方]

或仅一个:

class HUDExtremelySpecificInfo : A_GUI_Info<HUDExtremelySpecificInfoData> { .. }

© www.soinside.com 2019 - 2024. All rights reserved.