gpt4 book ai didi

c# - 如何在泛型参数中指定类和接口(interface)?

转载 作者:行者123 更新时间:2023-11-30 18:19:17 24 4
gpt4 key购买 nike

我有一个类需要布局 View实现 INavigationWrapper 的.如果我这样定义它:

public class NavigationStackLayout : Layout<T> where T : View, INavigationWrapper

然后我需要在其他地方指定 T。如果我这样定义它:

public class NavigationStackLayout : Layout<View>

public class NavigationStackLayout : Layout<INavigationWrapper>

然后类(class)的 children 缺少了他们类型的一部分。如果我这样定义它:

public class NavigationStackLayout : Layout<View : INavigationWrapper>

那么这是一个语法错误。如何在泛型参数中指定类和接口(interface),而不需要指定特定的子类?

更新:

明确一点,我不拥有 Layout<T> ,所以我不能只向我的非泛型类添加泛型方法;我需要使用 Layout<T>的现有方法。我知道它们会起作用,因为 Layout<T> 上的约束是where T : View .

我正在寻找一种解决方案,它可以完成以下工作:

class View1 : View, INavigationWrapper {}
class View2 : ContentView, INavigationWrapper {} // ContentView is a subclass of View
class View3 : View

var stack = new NavigationStackLayout();
stack.Add(new View1()); // this works
stack.Add(new View2()); // this also works
stack.Add(new View3()); // this fails at compile time

最佳答案

假设您可以只将一个类放入每个 NavigationStackLayout 对象中,您可以走通用路线并在单独的非通用类上添加一个静态方法,以通用方式创建一个实例并允许您避免必须命名通用参数。

或者选择一个具体的类,因为过于通用的代码不值得那么麻烦。

作为最后一个选项,您可以将所有函数重新实现为通用的并限制类型,只需为您的底层存储选择一种类型或另一种类型,并在取出时转换它。

根本的问题是你需要一个类型来填充泛型参数。您需要下注并要求其他人做出选择(通用)或选择存在的单一类型(因此 ViewINavigationWrapper)。

请注意,如果您希望以下类型共存于一个布局中,无论您做什么,您都将稍微改变类型安全规则(例如选择任意基类进行存储)。

class View1 : View, INavigationWrapper
class View2 : View, INavigationWrapper

关于c# - 如何在泛型参数中指定类和接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39266600/

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