c# - 在 C# 中继承泛型

标签 c# .net generics inheritance decorator

我已经继承了一个大型代码库,并且正在尝试在框架中实现一些新功能。基本上,为了以“正确”的方式做到这一点,我将不得不修改框架的整个结构。因为我不是框架的设计者,也不是读心者,所以这样做可能不会发生(尽管我真的很想自己从头开始重新设计它)。

因此,为了做我想做的事,我正在尝试实现某种装饰模式。 This answer from maliger表明我在下面所做的是完全有效的。但是,mono 似乎并不喜欢它;当我声明 HappyDecorator

时,它提示说 T 无法派生

请原谅这个过于简单的例子,但它明白了要点。

public class HappyObject
{
    public virtual void print()
    {
        Console.WriteLine ("I'm happy");
    }
}

public class VeryHappyObject : HappyObject
{
    public override void print()
    {
        Console.WriteLine ("I'm very happy");
    }

    public void LeapForJoy()
    {
        Console.WriteLine("Leaping For Joy!");
    }
}

public class SuperHappyObject : VeryHappyObject
{    
    public override void print()
    {
        Console.WriteLine ("I'm super happy!");
    }

    public void DieOfLaughter()
    {
        Console.WriteLine("Me Dead!");
    }
}

public class HappyDecorator<T> : T where T : HappyObject
{
    public string SpecialFactor { get; set; }

    public void printMe()
    {
        Console.WriteLine (SpecialFactor);
        print();
    }
}
class MainClass
{
    public static void Main (string[] args)
    {
        HappyDecorator<HappyObject> obj = new HappyDecorator<HappyObject> ();
        obj.SpecialFactor = Console.ReadLine();
        obj.printMe();
    }
}

最佳答案

您正在向 T 键入 HappyDecorator,但在该类中没有可使用的 T 实例。

public class HappyDecorator<T> where T : HappyObject
{
    private readonly T _instance;

    public HappyDecorator(T instance)
    {
        _instance = instance;
    }

    public string SpecialFactor { get; set; }

    public void printMe()
    {
        Console.WriteLine(SpecialFactor);
        _instance.print();
    }
}

另一种选择是使用通用方法而不是通用类来构造它。不过,它并不是真正的装饰器:

public class HappyDecorator
{
    public string SpecialFactor { get; set; }

    public void printMe<T>(T instance) where T : HappyObject
    {
        Console.WriteLine(SpecialFactor);
        instance.print();
    }
}

然后这样调用:

        HappyDecorator obj = new HappyDecorator();
        obj.SpecialFactor = Console.ReadLine();
        obj.printMe(new HappyObject()); 

关于c# - 在 C# 中继承泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28976164/

相关文章:

c# - 如何编写一个可以在不命名的情况下访问属性的类

c# - System.Xml.XmlException : Invalid character in the given encoding

C# 转换泛型类型(如 C++ 用户定义的转换)

c# - 获取 Office 插件发布版本

c# - 如何将可选文件复制到 VS 2017 中的输出目录?

.net - Windows 工作流基础中命名工作流事件的约定是什么?

generics - 当泛型参数具有多种数据类型时,如何在rust中实现泛型?

java - Google Guice - 具有相同的删除 - java 从 v6 升级到 v7 后出现编译错误

c# - Asp.Net:动态切换 UserControl - 如何?

c# - 不良 PKCS7 填充错误 : Invalid length 106