2014-01-14 172 views
0

我有一个超类,比方说BaseClass的和两个子类,比方说SubclassASubclassB,他们没有他们,但他们的父类之间的任何其他关系。儿童法

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

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

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

所以...那里一种避免重复所有代码的方法?

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

+0

这段代码是在SuperClass中?超类无法知道子类 –

回答

1

首先,多态性的概念是取消在调用对象之前检查对象的类型的需要。所以,这在OO语言中不应该是必需的。其次,为什么你可能在接口上使用抽象父类的原因不过是因为子类型(子类)之间有一些共享功能。因此,如果SubclassASubclassB之间存在共享的通用功能,请保持您的超类完好无损,否则将其切换到接口。

同样,正如你建议你自己,如果SubclassASubclassB有一个共同的行为(但自己的实现),然后利用一个单独的API(如果其他的子类型BaseClass不还共享行为(您#doStuff调用) 。

在这种情况下,我会介绍接口包含方法#doStuffStuff,并有我的两个SubclassASubclassB实现它,每个提供它自己的实现。然后,您的客户可以把你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

5

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

如果添加和更改父类可能是一个问题,您可以使用一个接口,然后由两个子类实现,您需要调用您的代码,您将只投到给定的接口和调用所需的方法。

事情是这样的:

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(); 
} 
2

的方法添加到超类。
使它与一个空的身体。

在SubClassA中覆盖它,实现你需要的逻辑。
在SubClassB中覆盖它,实现你需要的逻辑。

然后在你的调用代码,而不是做

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

只是这样做

obj.method(); 

提供obj被声明为父类的一个实例。

在超类中的空方法体,保证你有
没有任何问题与此“但我不能作为父类是父母
到不具有行为的其他子类”

这样的想法是,你将有空行为
在超类和所有子类,其
不明确重写此方法。

1

什么有以下两种方式:

  1. 声明超类中的目标方法,并提供一个默认的实现(例如空方法,什么也不做。)为好。如果需要,子类将覆盖该行为。
  2. 在Interface中声明目标方法,并使接口的SubclassA和SubclassB实现。超类和其他子类不需要实现接口。
1

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

0

您可以在超类protected上生成该方法。例如,你可以在父类做到这一点:

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

上的曝光SubclassA

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

和隐藏在SubclassB(只是没有覆盖它)

package test; 
public SubclassB extends SuperClass { 
} 

从不同的包装,除非类改变它的可见性修饰符,否则保护方法是不可见的。

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