【问题标题】:Polymorphism in Object construction对象构造中的多态性
【发布时间】:2015-03-06 00:18:03
【问题描述】:

我想根据类型参数创建特定的对象。 伪代码如下所示。

sub new {
    my $type = shift;
        if($type eq "S1") {$interface = X->new(); }
        if($type eq "S2") {$interface = Y->new(); }
etc...
    return $interface;  
}

选项可能是:

  1. 用 $type 参数替换“包”名称。需要与 $type 协调包名称。
  2. 在 Master 构造函数中使用 Hash{S1 => X} 根据传递的 $type 选择 V​​alue。添加新时需要哈希维护 对象类型。

我不喜欢上面的任何一个。寻找真正的多态方式来实现这一目标。 谢谢你, k

【问题讨论】:

  • 我不明白你期望什么样的解决方案。在我看来,必须有一种方法将S1XS2Y 相关联,因此您的选项2 之类的事情是不可避免的。 S1S2 有什么你没有告诉我们的吗?

标签: perl oop polymorphism


【解决方案1】:

您最好的选择可能是使用工厂模式。工厂方法获取用于创建类实例的参数,然后决定实例化哪个对象并从中返回。这也可以使依赖注入更容易进行测试。

您可能会看到这样的东西(在 Java 风格的代码中),带有一个员工对象:

public class EmployeeFactory 
{

    public static create(String type)
    {
        switch (type) {
            case type1:
                return new EmployeeTypeOne();
            case type2:
                return new EmployeeTypeTwo();
            default:
                throw new Exception("Unrecognized type");
         }
    }
}

您的员工将从一个通用接口或抽象类继承。如果您愿意,您也可以使用工厂来处理构造函数参数,只是尽量保持合理(不要传递一百万个参数 - 工厂应该在内部处理复杂对象)

更多信息请参见http://refactoring.com/catalog/replaceConstructorWithFactoryMethod.html

【讨论】:

  • 这似乎没有回答这个问题,即根据构造函数的参数选择一个类。您刚刚重写了 OP 的伪代码。
【解决方案2】:

你可能会喜欢Module::PluginFinder。在特定命名空间中创建所有特定类型,并为它们提供一些标识(常量?子?),然后主调度程序将使用这些标识来标识哪个类处理给定类型。

【讨论】:

    猜你喜欢
    • 2011-04-21
    • 1970-01-01
    • 2021-06-21
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多