Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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#_Design Patterns_Oop_Factory - Fatal编程技术网

将继承的类抽象化';工厂';C#

将继承的类抽象化';工厂';C#,c#,design-patterns,oop,factory,C#,Design Patterns,Oop,Factory,我不是很专业,我觉得我的问题很难描述,所以如果有什么不清楚的地方,请询问: 我有一个抽象类叫BaseDevice。 其他设备,如信标和应答器,从基本设备继承。 例如信标,它有基类方法加上自己的属性和方法。 比如说,这些设备之间的区别在于一个有两个LED,另一个有一个LCD 目前,它不可能使一个设备应答器以及信标(或者我必须复制粘贴到一个新的类,这是不想要的) 那么比如说,, 我想让一个设备对它说:“你有一个LED”,“你有两个LCD”或者其他什么。它附带的所有方法和属性都应该可用。 我仍然需要能

我不是很专业,我觉得我的问题很难描述,所以如果有什么不清楚的地方,请询问:

我有一个抽象类叫BaseDevice。 其他设备,如信标和应答器,从基本设备继承。 例如信标,它有基类方法加上自己的属性方法。 比如说,这些设备之间的区别在于一个有两个LED,另一个有一个LCD

目前,它不可能使一个设备应答器以及信标(或者我必须复制粘贴到一个新的类,这是不想要的)

那么比如说,, 我想让一个设备对它说:“你有一个LED”,“你有两个LCD”或者其他什么。它附带的所有方法和属性都应该可用。 我仍然需要能够查看设备列表中的设备“他是否有一个(或多个)LED”

结论:我想把我的“是A”变成“有A”(正如四人帮所建议的)

我曾经读过一篇关于工厂设计模式的文章,它看起来很复杂。在这种情况下,这是一个好的解决方案吗


也许我在这里使用了一些超出我知识范围的therms,这个项目是我第一个使用抽象类等的项目。我真的不是一个面向对象的程序员。设计模式对我来说很难阅读,所以容易阅读的答案是非常受欢迎的。

对我来说,这听起来像是你需要一个解决方案

在面向对象编程中,decorator模式是一种设计模式,允许将新的/附加的行为动态添加到现有对象中

decorator模式是子类化的一种替代方法。子类化在编译时添加行为,并且更改会影响原始类的所有实例;装饰可以在运行时为单个对象提供新的行为


对于您来说,棘手的部分是为所有子类定义一个通用接口。如果这不可能,您无论如何也不能以多态方式使用对象。

我认为您需要的是为设备的组件添加一些附加类。例如,如果存在与LED相关的行为,并且您发现自己复制/粘贴了此co德,这是一个强烈的信号,你需要一个LED类。
通过这种方式,您可以在具体组件上使用
列表
字段和
添加(LED newLed)
方法“关系。您可以为LCD设置另一个类,现在您可以在具体类中随意混合和匹配这些内容。

看起来不错!!谢谢,装饰者只能添加方法还是属性?最重要的是:我能看看设备是用什么装饰的吗?如果你想看到新的方法和属性,也许装饰器不是你的正确选择。这意味着能够以多态方式处理组件。也许你会像@Henk建议的那样简单地将各种组件聚合到设备中,这样做会更好。例如,在设备中放置一组LCD和另一组LED,然后将2个LED推入设备a,将1个LCD推入设备B,等等。谢谢,我想亨克删除了他的答案,但我明白他的意思。我会看看这样的解决方案是否可行。我希望有一个更漂亮的解决方案,因为这些设备可以有很多不仅仅是LED和LCD。谢谢你的回答,这归结为与Péter总结的相同的答案(在评论中)。