2017-05-26 77 views
0

我目前正在开发基本上有两种变体,基本变体(用于第三方开发人员)和特权变体(将在内部使用)的Android SDK。Java继承困境

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

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

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

我现在的问题是使用继承方法(这产生了代码味道是向我表示,还有一个可能是一个更好的解决方案),如下所示:

BaseAPI实例有BaseInterface一个实例,该实例在其一些方法中使用BaseDevice作为参数。

特权SDK具有PrivilegedAPI,PrivilegedInterfacePrivilegedDevice的实例。

问题出现在想要接口采用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); 
} 

但我不能用PrivilegedDevicePrivilegedInterface不同的参数覆盖deviceConnected

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

任何想法?

回答

0

在接口创建一个额外的方法:(这是方法重载的概念)

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

}

+0

尽管 – lorenzo

+0

使Privileged Device(Child)从BaseDevice(Parent)扩展,但'PrivilegedDevice'不应在'BaseInterface'中可用。 – HaroldSer

+0

我已经这样做了,但后来在回调方法中,设备被视为BaseDevice,因此无法访问PrivilegedDevice中的方法。 – lorenzo

0

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

public interface Device { 
    void deviceConnected(); 
} 

public class BaseDevice implements Device { 

    BaseDevice() { 

    } 

    void deviceConnected() { 

    } 
} 

public class PrivilegedDevice implements Device { 

    PrivilegedDevice() { 

    } 

    void deviceConnected() { 

    } 
} 
+0

该接口用于回调,因此如果我了解您说的正确,那么这不会解决这个问题 – lorenzo

0

这可能不为人们解决遇到在未来同一个问题的问题,而是整体的问题与我的课的层次和他们的一些内部做。

我实际上能够将一些东西移动到BaseAPI中,摆脱BaseDevice中使用的类,并基本上以更合理的方式重构了结构。最终的结果是我的类少了几个类和更合理的结构。

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