2010-06-23 98 views
1

我真的不亲,找到我的问题挺难形容,所以请问,如果有不清楚的地方:把我的继承类在一个抽象的“工厂” C#

我有一个叫BaseDevice抽象类。 其他设备,如Beacon和Transponder,继承自BaseDevice。 例如Beacon,它具有BaseClass方法和自己的属性方法。 比方说,这些设备之间的区别是,一个有2个LED,一个有LCD

目前它不可能做一个设备转发器以及灯塔(或我必须复制粘贴到一个新的类,这是不想要的)。

因此,例如, 我希望能够让一个设备对它说:“你有一个LED”,“你有2个LCD”或其他。并且随附的所有方法和属性都应该可用。我还需要能够看到我的设备列表中有哪些设备“他是否有一个(或多个)LED”

结论:我想让我的“是A”变成“”有A“(作为四人帮推荐)。

我对工厂设计模式这看起来复杂读一次。这将是在这种情况下,一个好的解决方案?

也许我用了一些撒姆这里超过我知识,这个项目是我第一次使用抽象类等。我真的没有太多的面向对象的程序员。设计模式很难让我阅读,所以回答t帽子很容易阅读,比欢迎。

回答

1

对我来说,这听起来像你需要一个Decorator

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

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

对你而言,棘手的部分是为所有的子类定义一个通用接口。如果这是不可能的,无论如何你都不能多态地使用你的对象。

+0

看起来不错!谢谢 修饰者是否只能添加方法或属性? 而且最重要的是:我可以看到设备装饰了什么吗? – SirLenz0rlot 2010-06-23 09:16:11

+0

如果你想看到新的方法和属性,也许装饰者不是你的正确选择。它意味着能够以多态方式处理组件。按照@Henk的建议,将各种组件集成到设备中,也许你会更好。例如。在设备中有一组LCD和另一组LED,然后将2个LED推入设备A,1个LCD进入设备B等。 – 2010-06-23 09:27:11

+0

谢谢,亨克删除了他的答案,但我明白了他的意思。我会看看是否有这样的事情 我希望有一个更漂亮的解决方案,因为这些设备可以有更多的不仅仅是LED和LCD。 – SirLenz0rlot 2010-06-23 09:38:17

1

我认为你需要的是你的设备组件的一些额外的类。例如,如果有一些与LED相关的行为,并且您发现自己复制/粘贴此代码,则这是一个强烈的迹象表明您需要LED类。 这样你可以有List<LED>字段和Add(LED newLed)方法,你可以在具体的组件上使用。基本上这是“有A”的关系。你可以有另一个LCD课程,现在你可以在你的具体课程中混合和匹配这些东西。

+0

感谢您的回答,这归结为Péter总结(在评论中)的相同答案。 – SirLenz0rlot 2010-06-24 08:53:53