避免使用带有附加方法的公共接口进行转换
Avoid casting with a common Interface with additional methods
我有 2 个 class,它们都有一个共同的基础 class。但最重要的是,它们还有每个 class 独有的额外方法。
它们在基本类型的对象集合中进行管理。
现在每当我想使用额外的方法时,我都必须检查类型和转换。
我怎样才能避免这种情况?
到目前为止我想出了
- 实施虚拟方法(并忽略它们)
- 铸造(我觉得不是很优雅)
- 访问者模式(但有访问者中的功能)
我想知道是否有人有其他想法。
(伪代码)
Interface CommonBase
{
void Common method()
}
class SubClassA : CommonBase
{
void Extra MethodA()
}
class SubClassB : CommonBase
{
void Extra MethodB()
}
我有一个列表 List<CommonBase>
。
如何避免在调用方法 A/B 之前进行强制转换?或者以某种方式执行方法 A/B?
的功能
您试图完成的行为是您想要引用具有基本 class/interface 类型的子 class 实例,但您想要调用特定于子 [=20] 的方法=]是的。这是矛盾的,因为在处理不同类型但具有共同基础的对象时,假定处理器不关心子类型,但在您的情况下,处理器确实关心子类型并且想要做子类型特定的东西。你是对的,一种方法是使用 instanceof 运算符检查类型并转换它,是的,它不是很优雅。
我能想到的另一种方法,可能是唯一的方法是在 CommonBase 中使用另一种具有通用名称的方法,例如 "delegate" 或 "process",而不定义它在内部做什么,然后提供此方法的子类型中的实现。
interface CommonBase {
void delegate();
}
class SubTypeA implements CommonBase {
public void delegate() {
//invoke actual method with proper name
}
}
class SubTypeB implements CommonBase {
public void delegate() {
//invoke actual method with proper name
}
}
希望对您有所帮助。
我有 2 个 class,它们都有一个共同的基础 class。但最重要的是,它们还有每个 class 独有的额外方法。 它们在基本类型的对象集合中进行管理。
现在每当我想使用额外的方法时,我都必须检查类型和转换。
我怎样才能避免这种情况? 到目前为止我想出了
- 实施虚拟方法(并忽略它们)
- 铸造(我觉得不是很优雅)
- 访问者模式(但有访问者中的功能)
我想知道是否有人有其他想法。 (伪代码)
Interface CommonBase
{
void Common method()
}
class SubClassA : CommonBase
{
void Extra MethodA()
}
class SubClassB : CommonBase
{
void Extra MethodB()
}
我有一个列表 List<CommonBase>
。
如何避免在调用方法 A/B 之前进行强制转换?或者以某种方式执行方法 A/B?
您试图完成的行为是您想要引用具有基本 class/interface 类型的子 class 实例,但您想要调用特定于子 [=20] 的方法=]是的。这是矛盾的,因为在处理不同类型但具有共同基础的对象时,假定处理器不关心子类型,但在您的情况下,处理器确实关心子类型并且想要做子类型特定的东西。你是对的,一种方法是使用 instanceof 运算符检查类型并转换它,是的,它不是很优雅。
我能想到的另一种方法,可能是唯一的方法是在 CommonBase 中使用另一种具有通用名称的方法,例如 "delegate" 或 "process",而不定义它在内部做什么,然后提供此方法的子类型中的实现。
interface CommonBase {
void delegate();
}
class SubTypeA implements CommonBase {
public void delegate() {
//invoke actual method with proper name
}
}
class SubTypeB implements CommonBase {
public void delegate() {
//invoke actual method with proper name
}
}
希望对您有所帮助。