【问题标题】:Using generic types in C# [closed]在 C# 中使用泛型类型 [关闭]
【发布时间】: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 也设为通用?然后您的内容接收器也可以是通用的并接受/期望相同的内容类型

标签: c# unity3d generics


【解决方案1】:

您在抽象/通用类UIContentProvider<T> 中说过您想要这样的方法:

public abstract object ProvideContent();

并且您希望能够在您的具体实现中使用此覆盖 TextProvider

public override string ProvideContent(){...};

但我认为你错过了抽象类中泛型的意义......如果你不使用类型参数 T 有什么意义?

这不是你想要的吗?

public interface IUIContentProvider<T>
{
    T ProvideContent();
}

public abstract class UIContentProvider<T> : IUIContentProvider<T>
{
    public abstract T ProvideContent();
}


public class TextProvider : UIContentProvider<string>
{
    public override string ProvideContent()
    {
        return "";
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多