Java继承困境
我目前正在开发基本上有两种变体,基本变体(用于第三方开发人员)和特权变体(将在内部使用)的Android SDK。Java继承困境
特权SDK只是增加了第三方开发人员无法直接访问的附加功能。
我的想法是使用宏选择性地删除功能,但Java不支持。
我的下一个想法是采取基本变化,并在那里扩展类和接口来产生特权变体。
我现在的问题是使用继承方法(这产生了代码味道是向我表示,还有一个可能是一个更好的解决方案),如下所示:
的BaseAPI
实例有BaseInterface
一个实例,该实例在其一些方法中使用BaseDevice
作为参数。
特权SDK具有PrivilegedAPI
,PrivilegedInterface
和PrivilegedDevice
的实例。
问题出现在想要接口采用BaseDevice
或PrivilegedDevice
的实例。
我会非常喜欢这个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);
}
但我不能用PrivilegedDevice
在PrivilegedInterface
不同的参数覆盖deviceConnected
。
我的另一个想法是利用构建口味来隐藏功能,但这似乎并不适合。
任何想法?
在接口创建一个额外的方法:(这是方法重载的概念)
public interface BaseInterface {
void deviceConnected(BaseDevice baseDevice);
void deviceConnected(PrivilegedDevice privilegedDevice);
}
我认为你需要抽象掉的设备类。
public interface Device {
void deviceConnected();
}
public class BaseDevice implements Device {
BaseDevice() {
}
void deviceConnected() {
}
}
public class PrivilegedDevice implements Device {
PrivilegedDevice() {
}
void deviceConnected() {
}
}
该接口用于回调,因此如果我了解您说的正确,那么这不会解决这个问题 – lorenzo
这可能不为人们解决遇到在未来同一个问题的问题,而是整体的问题与我的课的层次和他们的一些内部做。
我实际上能够将一些东西移动到BaseAPI
中,摆脱BaseDevice
中使用的类,并基本上以更合理的方式重构了结构。最终的结果是我的类少了几个类和更合理的结构。
代码味道是我的代码中有一些过分复杂的部分的结果。
尽管 – lorenzo
使Privileged Device(Child)从BaseDevice(Parent)扩展,但'PrivilegedDevice'不应在'BaseInterface'中可用。 – HaroldSer
我已经这样做了,但后来在回调方法中,设备被视为BaseDevice,因此无法访问PrivilegedDevice中的方法。 – lorenzo