【问题标题】:Deduce derived types polymorphically多态地推导派生类型
【发布时间】:2018-12-17 05:39:03
【问题描述】:

以下情况的推荐设计方法/替代方案是什么:

BaseCalculator:
BaseType prepareData()
useData(BaseType)

派生计算器使用派生类型覆盖基本功能 -

DerivedCalculator1:
BaseType prepareData(){ return DerivedType1}
useData(BaseType t1){ DerivedType1 t=(DerivedType1)t1 //typecast  down and proceed....}

DerivedCalculator2
BaseType prepareData(){ return DerivedType2}
useData(BaseType t1){ DerivedType2 t=(DerivedType2)t1 //typecast down and proceed....}

是否有一种设计方法可以避免派生类进行类型转换 - 因为它总是为运行时的事故打开大门?

【问题讨论】:

  • 您可以使用泛型:class BaseCalculator<T extends BaseType> { T prepareData(); void useData(T t)

标签: java design-patterns polymorphism clean-architecture


【解决方案1】:

另一种选择是将多态行为移到BaseType 的实现中,而不是BaseCalculator 的实现中。例如:

public interface BaseType {
    public void process(Calculator calc);
}

public class DerivedType1 implements BaseType {

    @Override
    public void process(Calculator calc) {
        // Do something specific to derived type 1
    }
}

public class DerivedType2 implements BaseType {

    @Override
    public void process(Calculator calc) {
        // Do something specific to derived type 2
    }
}

public class Calculator {

    public void doSomething(BaseType bt) {
        bt.process(this);
    }
}

如果这种类型的解决方案不充分,更复杂的解决方案是Visitor Pattern。访问者模式允许使用double-dispatch 的任意BaseCalculator 处理任意任意BaseType 对象。问题是所有BaseCalculator 实现都必须有一个方法来处理每个BaseType 实现。例如:

public interface BaseType {
    public void process(Calculator calc);
}

public class DerivedType1 implements BaseType {

    @Override
    public void process(Calculator calc) {
        // Do something specific to derived type 1
    }
}

public class DerivedType2 implements BaseType {

    @Override
    public void process(Calculator calc) {
        // Do something specific to derived type 2
    }
}

public interface BaseCalculator {
    public void handle(DerivedType1 dt);
    public void handle(DerivedType2 dt);
}

public class DerviedCalculator1 implements BaseCalculator {

    @Override
    public void handle(DerivedType1 dt) {
        dt.process(this);
    }

    @Override
    public void handle(DerivedType2 dt) {
        dt.process(this);
    }
}

public class DerviedCalculator2 implements BaseCalculator {

    @Override
    public void handle(DerivedType1 dt) {
        dt.process(this);
    }

    @Override
    public void handle(DerivedType2 dt) {
        dt.process(this);
    }
}

【讨论】:

    猜你喜欢
    • 2016-07-03
    • 1970-01-01
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2011-02-01
    相关资源
    最近更新 更多