gpt4 book ai didi

c# - 在 C# 中继承泛型

转载 作者:太空宇宙 更新时间:2023-11-03 23:41:10 24 4
gpt4 key购买 nike

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

因此,为了做我想做的事,我正在尝试实现某种装饰模式。 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/

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