需要抽象对象集合(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
。