超类(java)中的子方法



我有一个超类,比如说BaseClass和两个子类,比如Subclass aandsubclass B,它们之间除了父类之外没有任何其他关系。

在我的代码中的很多地方,我需要调用两个子类都有但父类没有的方法。。。我发现自己重复了很多代码,看起来像:

if (obj instanceof SubclassA) {
// stuff
} else if (obj instanceof SubclassB) {
// same stuff
}

第一个想法应该是将"东西"放入超类中的方法中,但我不能,因为该超类是其他没有这种行为的子类的父类。。。

所以。。。有没有办法避免重复该代码的aaalll?

也许两个子类的一个公共超类是超类的一个子类本身?

我建议将该方法提取为父类中的抽象方法(如果父类是抽象的),或者只是将在子类中重写的方法。如果这是不可能的,或者是不可取的,我建议添加一个公共抽象类来扩展父类,该父类只有两个子类通用的方法,然后由这两个子类进行扩展。

如果添加和更改父类可能是一个问题,那么您可以使用一个接口来做同样的事情,该接口随后由两个子类实现,并且在需要调用代码的地方,您只需转换到给定的接口并调用所需的方法。

类似这样的东西:

interface CommonInterface {
void commonMethod();
}
class SubClassB implements CommonInterface {
void commonMethod() {
// implementation
}
}
class SubClassA implements CommonInterface {
void commonMethod() {
// implementation
}
}
//...
if (obj instanceof CommonInterface) {
((CommonInterface)object).stuffCall();
} 

将方法添加到超级类中
用一个空的身体

在SubClassA中重写它,实现您需要的逻辑
在SubClassB中重写它,实现您需要的逻辑

然后在您的呼叫代码中,而不是进行

if (obj instanceof SubclassA) {
obj.method();
} else if (obj instanceof SubclassB) {
obj.method();
}

只做这个

obj.method();

假设CCD_ 1被声明为父类的实例。

超级类中的空方法体保证您对此没有问题,"但我不能,因为该超级类是其他没有该行为的子类的父级
">

因此,我们的想法是,您将在超级类和所有子类中有空的行为
,这些子类
没有显式覆盖此方法

首先,多态性的概念是在调用对象的方法之前不需要检查对象的类型。因此,在OO语言中这不应该是必要的。

其次,在接口上使用抽象父类的原因是,子类型(子类)之间存在一些共享功能。因此,如果SubclassASubclassB之间有共享的、通用的功能,那么就保持超类不变,否则就将其切换到接口。

同样,正如您自己建议的那样,如果SubclassASubclassB具有共同的行为(但它们自己的实现),则使用单独的API(如果BaseClass的其他子类型也不共享该行为(您的#doStuff调用)。

在这种情况下,我将介绍包含方法#doStuff的接口Stuff,并让我的obj0和SubclassB实现它,每个都提供自己的实现。然后,您的客户端可以将您的obj实例视为Stuff,而不管它的真实类型如何,剩下的由多态性完成

interface Stuff {
void doStuff();
}
public class SubclassA extends BaseClass implements Stuff {
// Does it need BaseClass still?
public doStuff() {
...
} 
}
public class SubclassB extends BaseClass implements Stuff {
// Does it need BaseClass still?
public doStuff() {
...
} 
}
// Example client code...
public class MyStuffClient {
Stuff s = new SubclassA();
...
public void onStuff() {
s.doStuff();
} 
}

决定您是否真的需要suer类BaseClass

以下两种方式如何:

  1. 在超类中声明目标方法,并提供默认实现(例如,空方法,什么都不做)。如果需要,子类将覆盖该行为
  2. 在接口中声明目标方法,并实现接口的Subclass a和Subclass B。超级类和其他子类不需要实现接口

如果子类A和子类B有一些在子类C、D、E等中不存在的行为,那么只需在父类与A和B之间引入一个中间类。C、D等派生自父类,而B派生自新类,其中包含A和B共享的功能。

您可以在超类protected上创建该方法。例如,您可以在SuperClass:上执行此操作

package test;
public SuperClass {
protected void myMethod() {
...stuff...
}
}

子类A上曝光

package test;
public SubclassA extends SuperClass {
public void myMethod() {
super.myMethod();
}
}

并隐藏在子类B上(只是不覆盖它)

package test;
public SubclassB extends SuperClass {
}

在不同的包中,受保护的方法是不可见的,除非类重写它并更改其可见性修饰符。

来源:http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

最新更新