Java继承困境

时间:2017-05-26 16:41:32

标签: java android inheritance

我目前正在开发基于两种变体的Android SDK,基本变体(针对第三方开发人员)和特权变体(将在内部使用)。

特权SDK只是添加了第三方开发人员无法直接访问的其他功能。

我的想法是使用宏来有选择地删除功能,但Java不支持。

我的下一个想法是采用基本变体,只是在那里扩展类和接口以产生特权变体。

我目前的问题如下使用继承方法(它产生了一种代码气味,向我表明可能有更好的解决方案):

BaseAPI的实例的实例为BaseInterface,在某些方法中使用BaseDevice作为参数。

特权SDK的实例为PrivilegedAPIPrivilegedInterfacePrivilegedDevice

问题在于希望接口采用BaseDevicePrivilegedDevice的实例。

我最喜欢这个BaseInterface:

public interface BaseInterface {
    void deviceConnected(BaseDevice device);
}

这个PrivilegedInterface:

public interface PrivilegedInterface extends BaseInterface {
    //overwrites deviceConnected in BaseInterface with PrivilegedDevice
    @Override
    void deviceConnected(PrivilegedDevice device);
}

但我无法使用deviceConnectedPrivilegedDevice的其他参数覆盖PrivilegedInterface

我的另一个想法是利用构建风格来隐藏功能,但这似乎也不合适。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

在界面中创建一个额外的方法:(这是方法重载的概念)

public interface BaseInterface {
    void deviceConnected(BaseDevice baseDevice);
    void deviceConnected(PrivilegedDevice privilegedDevice);

}

答案 1 :(得分:0)

我认为你需要抽象掉设备类。

public interface Device {
    void deviceConnected();
}

public class BaseDevice implements Device {

    BaseDevice() {

    }

    void deviceConnected() {

    }
}

public class PrivilegedDevice implements Device {

    PrivilegedDevice() {

    }

    void deviceConnected() {

    }
}

答案 2 :(得分:0)

这可能无法解决将来遇到同样问题的人的问题,但整体问题与我的课程的层次结构及其内部部分有关。

我能够将一些内容移动到BaseAPI中,摆脱BaseDevice内部使用的类,并且基本上以更合理的方式重构事物。最终结果是我的类少了一些类和更合理的结构。

代码气味是我的代码中有一些过于复杂的部分的结果。