Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
需要抽象对象集合(C#)_C#_Oop_Polymorphism - Fatal编程技术网

需要抽象对象集合(C#)

需要抽象对象集合(C#),c#,oop,polymorphism,C#,Oop,Polymorphism,在下面的简化示例中,我需要将集合类抽象为printfourtsandeaters(oranges,orangeEaters)或打印水果和苹果树(苹果树、苹果树) 成为可能: abstract class Fruit abstract class FruitEater class Apple : Fruit class AppleEater : FruitEater class Orange : Fruit class OrangeEater : FruitEater class AppleC

在下面的简化示例中,我需要将集合类抽象为
printfourtsandeaters(oranges,orangeEaters)或<代码>打印水果和苹果树(苹果树、苹果树)
成为可能:

abstract class Fruit
abstract class FruitEater

class Apple : Fruit
class AppleEater : FruitEater
class Orange : Fruit
class OrangeEater : FruitEater

class AppleCollection : List<Apple>
class OrangeCollection : List<Orange>
class AppleEaterCollection : List<AppleEater>
class OrangeEaterCollection : List<OrangeEater>
抽象类水果
抽象类食果者
苹果类:水果
申请者:食果者
橙色类:水果
食橙类:食果类
类AppleCollection:列表
类OrangeCollection:列表
类AppleEaterCollection:列表
类OrangeEaterCollection:列表
我已经尝试模板化方法和集合类,但我需要访问特定于水果和水果食者类的方法:

class FruitCollection<T> : List<T>
class FruitEaterCollection<T> : List<T>

void PrintFruitsAndEaters<T, S>(FruitCollection<T> fruits, FruitEaterCollection<S> eaters)
类集合:列表
类FrootEaterCollection:列表
void print果品采摘器(果品采摘器、果品采摘器、果品采摘器)
那么您需要:

void PrintFruitsAndEaters<T, S>(
    FruitCollection<T> fruits,
    FruitEaterCollection<S> eaters)
        where T : Fruit
        where S : FruitEater
{
    // ...
}
但是这仍然不允许您忽略方法上的约束。

(另外,继承
列表
是一件坏事,请改用
IList

然后您需要:

void PrintFruitsAndEaters<T, S>(
    FruitCollection<T> fruits,
    FruitEaterCollection<S> eaters)
        where T : Fruit
        where S : FruitEater
{
    // ...
}
但是这仍然不允许您忽略方法上的约束。


(另外,继承
列表
是一件坏事,请改用
IList

@Brian:错了。将约束应用于集合(而不是方法)将导致方法根本无法编译,因为
T
S
将与类型的泛型参数不兼容。编译器不会为您推断这些约束。对集合类型应用约束对API来说可能也不错,但并不能最终解决问题。@cdhowie:你说得对。我们需要协方差。我正在放弃我的答案,因为我现在在Mac电脑上,我不想重新启动:)也删除我的评论。@Brian:嗯,你仍然需要提供带有协方差的通用参数。:)如果你的答案行得通的话,你的答案会非常圆滑(我已经提出了一个建议,把收集类型的限制添加到我的答案中,但是已经指出,单独做这件事并不能解决这个问题。希望你不要考虑那个剽窃。):我和你当初的想法一样。但当我开始模拟一个实现时,我发现它很快就崩溃了。@cdhowie:是的,我道歉。我的回答不完整,我确信我在大脑中编译的是正确的!:)尽管我很喜欢/使用泛型,但它们可能会变得很糟糕。以我的投票作为道歉。我沉迷于这个该死的网站。需要休息。:)+1.很高兴您澄清,最好也对集合进行限制<代码>类集合:列表
是一个相当无意义的声明;它不会阻止
水果收集
。我会更进一步,将
水果食者
更改为
水果食者,其中T:Fruit
@Brian:error。将约束应用于集合(而不是方法)将导致方法根本无法编译,因为
T
S
将与类型的泛型参数不兼容。编译器不会为您推断这些约束。对集合类型应用约束对API来说可能也不错,但并不能最终解决问题。@cdhowie:你说得对。我们需要协方差。我正在放弃我的答案,因为我现在在Mac电脑上,我不想重新启动:)也删除我的评论。@Brian:嗯,你仍然需要提供带有协方差的通用参数。:)如果你的答案行得通的话,你的答案会非常圆滑(我已经提出了一个建议,把收集类型的限制添加到我的答案中,但是已经指出,单独做这件事并不能解决这个问题。希望你不要考虑那个剽窃。):我和你当初的想法一样。但当我开始模拟一个实现时,我发现它很快就崩溃了。@cdhowie:是的,我道歉。我的回答不完整,我确信我在大脑中编译的是正确的!:)尽管我很喜欢/使用泛型,但它们可能会变得很糟糕。以我的投票作为道歉。我沉迷于这个该死的网站。需要休息。:)+1.很高兴您澄清,最好也对集合进行限制<代码>类集合:列表是一个相当无意义的声明;它不会阻止
水果收集
。我会更进一步,将
水果食者
更改为
水果食者,其中T:Fruit