【发布时间】:2021-03-10 15:44:43
【问题描述】:
我很难弄清楚如何使用 C# 的通用系统所限制的严格类型系统来实现看似简单的模式。我主要来自 Java 背景,习惯于泛型类型的通配符。由于 C# 不允许这样的事情,我需要你的帮助来找出最优雅的方式来实现以下内容(我的实现是针对 Unity3D 项目,但我认为这真的不重要):
我有 Content Providers 可以提供各种类型的内容(例如“纹理”、“字符串”类型的对象...) 因此,我创建了一个抽象的泛型类和一个接口,使我的架构看起来像这样
此外,我有 Content Receiver,它们能够处理某种类型的内容,以及一个带有一组这样的 Content Receiver 的管理类。我想要接收者必须以如下样式处理给定提供者的内容的逻辑:
public void accept(IUIContentProvider provider){
//1. Check if a receiver for the generic type of the provider exists
//2. Ignore the call if no such receiver exists, otherwise pass the provider to this class and
//let it deal with it in some specific manner.
}
但是由于 C# 的强类型系统,使用多态似乎不可能做任何优雅的事情。我显然也无法显式转换 IUIContentProvider 。我什至不能使用抽象的基础方法,例如:
public abstract object provideContent()
并用例如覆盖它:
public override Texture provideContent(){...}
此时我开始怀疑在 C# 中为此目的使用泛型是否明智...
【问题讨论】:
-
您没有显示足够的代码来演示问题。发布您到目前为止所写的内容以及其中的哪些部分不起作用,然后也许我们可以提供帮助。
-
我不明白你在做什么?如果我的记忆力好的话,我也认为类型系统和 java 一样严格......
-
如果您的
UIContentProvider<T>是通用的.. 为什么不简单地将IUIContentProvider也设为通用?然后您的内容接收器也可以是通用的并接受/期望相同的内容类型