gpt4 book ai didi

C#泛型接口(interface)和继承

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

为我的问题选择的标题不是很准确,但我不知道我正在寻找的术语,甚至不知道它是否可能。

我想到的是一个消费者链 <- procucer <-product。消费者可以“消费”生产者,而生产者可以“生产”某种类型的产品。为此我写道:

public interface IProduct
{
string ProductName { get; }
}

public class Product : IProduct
{
public string ProductName { get { return "name of product"; } }
}

public interface IProducer<T>
{
T ProducerProperty { get; set; }

void ProducerMethod();
}

public class Producer<T> : IProducer<T> where T : IProduct
{
public Producer()
{

}
public T ProducerProperty { get; set; }

public void ProducerMethod()
{

}
}

public interface IConsumer<T>
{
T ConsumerProperty { get; set; }
void ConsumerMethod();
}

public class Consumer<T> : IConsumer<T>
{
private U producer; //U should be IProducer<IProduct>, doesen't work

public Consumer(U producer) //U should be IProducer<IProduct>, doesen't work
{
this.producer = producer;
}

public T ConsumerProperty { get; set; }

public void ConsumerMethod()
{

}
}

和用例:

private IProducer<IProduct> producer;   //DeviceManager

private IConsumer<IProducer<IProduct>> consumer; //DeviceViewManager


public MainPage()
{
this.InitializeComponent();

producer = new Producer<IProduct>();
consumer = new Consumer<IProducer<IProduct>>();
}

消费者类使用泛型“U”,此时是虚构的。我希望消费者类使用类型 U。在给定示例的上下文中,您可以想到一个用户消费来自不同面条制造商的不同类型的面条。 我希望通用类绑定(bind)到接口(interface)而不是实际类。但我无法做到这一点。我尝试用基类(例如:ProducerBase)替换接口(interface),但实际的基类是需要的。

最佳答案

问题

如果您定义 Consumer像这样上课

public class Consumer<T, U> : IConsumer<T, U>
{
...
}

你得到了错误

CS0314 The type 'T' cannot be used as type parameter 'T' in the generic type or method IConsumer<T, U>'. There is not boxing conversion or type parameter conversion from 'T' to ''IProducer'.

CS0314 The type 'U' cannot be used as type parameter 'U' in the generic type or method IConsumer<T, U>'. There is not boxing conversion or type parameter conversion from 'U' to ''IProducer'.

这告诉您的是,您无法从 IConsumer<T, U> 派生出接口(interface),因为它对其泛型类型参数有约束:

public interface IConsumer<T, U>
where T : IProducer<U> // T needs to "be" an IProducer<U>
where U : IProduct // U needs to "be" an IProduct
{
...
}

因为界面需要 TUIProducer<U> 派生和 IProduct分别并且编译器不知道泛型类型参数 TUConsumer实际上可以转换IProducer<U>IProduct分别。


解决方案

因此,如果您定义 Consumer像这样并为 T 添加约束和 U

public class Consumer<T, U> : IConsumer<T, U>
where T : IProducer<U>
where U : IProduct
{
...
}

它将起作用,因为现在您指定了 TU总是一个IProducer<U>IProduct分别。


我希望上面的解释是可以理解的;无论哪种方式,您还应该阅读 this以便更好地理解泛型类型的约束。

关于C#泛型接口(interface)和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49846721/

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