【问题标题】:Awkward OOP: Same method on different classes not inherited?尴尬的 OOP:不同类的相同方法未继承?
【发布时间】:2012-08-10 19:01:58
【问题描述】:

这里是交易: 我有两个不同类的对象,一个DataSizeAction 和一个DataColorAction。这些类有一个共同的祖先 EncoderAction 不远。

这两个对象都公开了一个名为setScale(int scale) 的方法,该方法为它们执行的编码设置了比例类型。该方法在两种情况下都做同样的事情。

但是,该方法不存在于任何共同的祖先中(顺便说一句,这个 OO 是我正在使用的库,设计不取决于我的判断)。

我想编写一个方法,该方法采用 DataSizeAction 或 DataColorAction 并在该对象上调用 setScale。

我的问题是:在我使用 instanceof 暴力破解单独的案例之前,有没有更优雅的方法来处理这个问题?

谢谢!

【问题讨论】:

    标签: java oop inheritance


    【解决方案1】:

    你能在你的层次结构中添加接口吗?

    interface IScalable {
       void setScale(int scale);
       int getScale();
    }
    
    class DataSizeAction extends EncoderAction implements IScalable {
       ...
    }
    
    class SomeoneElse {
       private int scale = 2;
    
       public void setScale(IScalable scalable) {
          scalable.setScale(this.scale);
       }
    }
    

    【讨论】:

    • 好吧,这应该可行,虽然因为 DataSizeAction 和 DataColorAction 都是库类(抱歉我没有澄清这一点),我必须扩展它们并在子类中实现新接口。
    【解决方案2】:

    试试这个:

    1. 创建另一个扩展 EncoderAction 的类
    2. setScale 声明为其中的抽象方法
    3. DataSizeActionDataColorAction 扩展您的新类。

    现在,您可以编写代码来引用新基类的实例,避免调用instanceof 检查。

    注意:尽管我在这里应该可以工作,但我会推荐Jonathon 的答案。由于这是对功能的保证,并且与您的对象的组合没有任何关系,因此接口很可能是要走的路。

    【讨论】:

    • 你应该注意到他提到了它的一个库,他不能在其中做这个修改
    • 实际上,请参阅乔纳森的回答。我觉得这样更好。
    • 正如你所说,界面更适合这种方法,但想法很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多