Questions tagged «polymorphism»

4
以适当的方式将条件替换为多态吗?
考虑两个类Dog并且Cat都符合Animal协议(就Swift编程语言而言。这将是Java / C#中的接口)。 我们有一个屏幕,显示猫和狗的混合列表。有一个Interactor类处理幕后逻辑。 现在,我们要向用户显示删除猫的确认警报。但是,需要立即删除狗而不发出任何警报。有条件的方法如下所示: func tryToDeleteModel(model: Animal) { if let model = model as? Cat { tellSceneToShowConfirmationAlert() } else if let model = model as? Dog { deleteModel(model: model) } } 该代码如何重构?闻起来很香

4
替换为Java的instanceof?
因此,我对现实世界中的编程(学术项目之外)还很陌生,并且遇到了很多帖子,他们说instanceof使用来确定特定对象的类是一件坏事。 我的情况是我有三个类,一个基本产品类,一个扩展了该类,另一个扩展了该类。这些都存储在数据库的同一表中,我有一些代码需要使用每个方法来提取数据。 解决这种问题的最佳实践是什么?我已经阅读了有关多态性的一些知识,但是找不到解决我所遇到问题的任何示例。它们通常都覆盖了一个对我来说不起作用的方法,因为我需要从不同的对象中提取不同的东西。 有没有更好的方法可以做到这一点,还是我坚持使用instanceof某种反射来获取特定于对象的字段?

4
允许库分离的多态行为设计模式
假设我有一个Item类的层次结构:Rectangle, Circle, Triangle。我希望能够绘制它们,所以我的第一种可能是Draw()向每个虚拟方法添加一个虚拟方法: class Item { public: virtual ~Item(); virtual void Draw() =0; }; 但是,我想将绘图功能拆分到单独的Draw库中,而Core库仅包含基本表示形式。我可以想到几种可能性: 1-A DrawManager接受Items 的列表,必须使用它dynamic_cast<>来确定要做什么: class DrawManager { void draw(ItemList& items) { FOREACH(Item* item, items) { if (dynamic_cast<Rectangle*>(item)) { drawRectangle(); } else if (dynamic_cast<Circle*>(item)) { drawCircle(); } .... } } }; 这不是理想的选择,因为它依赖于RTTI并迫使一个类了解层次结构中的所有项。 2-另一种方法是将绘图责任推迟到一个ItemDrawer层次结构(RectangleDrawer,等): class Item { virtual …

3
两个组件提供相同的功能,但依赖关系不同
我正在使用Zend Framework 1和Doctrine2作为ORM层在PHP中构建应用程序。一切进展顺利。现在,我偶然发现ZF1和Doctrine2都附带并依赖于它们自己的缓存实现。我对两者都进行了评估,虽然每个人都有自己的优点和缺点,但就我的简单需求而言,它们都不比其他人优越。这两个库似乎都是针对各自的接口而不是针对其实现编写的。 我之所以认为这是一个问题,是因为在应用程序的引导过程中,我必须配置两个缓存驱动程序-每个都有自己的语法。这样很容易造成不匹配,因此,与缓存后端建立两个连接的效率很低。 我正在尝试确定最佳的前进方式,并欢迎您可能提供的任何见解。 到目前为止,我想到的是四个选择: 不执行任何操作,请接受存在两个提供缓存功能的类。 创建一个Facade类,将Zend的接口粘贴到Doctrine的缓存实现上。 选项2的另一种方法-创建一个Facade,以在Zend Framework后端上映射Doctrine的界面。 使用多接口继承创建一个接口来统治所有接口,并祈祷不存在任何重叠(即:如果两个都有“保存”方法,由于PHP的原因,它们将需要以相同的顺序接受参数)缺乏适当的多态性)。 哪个选项是最佳选择,或者我不知道有没有“以上所述”变体?

1
隐式与显式接口
我想我了解编译时多态和运行时多态的实际限制。但是显式接口(运行时多态,即虚拟函数和指针/引用)与隐式接口(编译时多态,即模板)之间在概念上有什么区别。 我的想法是,提供相同显式接口的两个对象必须是相同类型的对象(或具有共同的祖先),而提供相同隐式接口的两个对象不必是相同类型的对象,并且不包括隐式对象他们俩都提供的接口可以具有完全不同的功能。 有什么想法吗? 并且,如果两个对象提供相同的隐式接口,那么还有什么原因(除了不需要动态分配带有虚拟函数查找表的技术好处等)之外,还有其他原因导致这些对象不能从声明该接口的基础对象继承而来。使它成为显式接口?换一种说法:您能给我一个例子吗,两个提供相同隐式接口的对象(因此可以用作示例模板类的类型)不应从使该接口显式的基类继承? 一些相关的帖子: https://stackoverflow.com/a/7264550/635125 https://stackoverflow.com/a/7264689/635125 https://stackoverflow.com/a/8009872/635125 这是使这个问题更具体的示例: 隐式接口: class Class1 { public: void interfaceFunc(); void otherFunc1(); }; class Class2 { public: void interfaceFunc(); void otherFunc2(); }; template <typename T> class UseClass { public: void run(T & obj) { obj.interfaceFunc(); } }; 显式接口: class InterfaceClass { public: virtual void …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.