我有以下两种方法:
void m1(SourceClass s, ClassA a);
void m2(SourceClass s, ClassB b);
ClassA和ClassB实际上共享一些共同的属性,但是,我们不能编写另一个父类&让ClassA & ClassB继承父类,因为ClassA & ClassB不在我们的控制范围之内。
问:没有重复的代码,如果ClassA ...否则如果ClassB ..。为了达到编写继承的新父类的效果,处理这种情况的最佳方法是什么?谢谢。
发布于 2016-02-25 05:37:42
有一个非常好的设计模式Decorator Design可以解决以下问题:
注意:在Strategy Design Pattern之后的单独类中提取公共代码段,并动态地更改对象的行为。
例如:
public class CommonSteps {
public void perform() {
System.out.println("common steps");
}
}
public class A{
private CommonSteps commonSteps;
public A(CommonSteps commonSteps) {
this.commonSteps = commonSteps;
}
public void action() {
System.out.println("some steps of class A");
commonSteps.perform();
System.out.println("some more steps of class A");
}
}
public class B{
private CommonSteps commonSteps;
public B(CommonSteps commonSteps) {
this.commonSteps = commonSteps;
}
public void action() {
System.out.println("some steps of class B");
commonSteps.perform();
System.out.println("some more steps of class B");
}
}
编辑:
以下是根据您的需求和步骤提供的完整示例代码:
步骤:
创建具有公共方法签名的接口Wrapper
。
interface Wrapper {
void setP1(String p1);
void setP2(String p2);
}
创建类特定的Wrapper
接口实现,如下所示。
class ClassAWrapper implements Wrapper{
ClassA classA;
ClassAWrapper(ClassA classA){
this.classA = classA;
}
@Override
public void setP1(String p1)
{
classA.setP1(p1);
}
@Override
public void setP2(String p2)
{
classA.setP2(p2);
}
}
现在将方法签名更改为
void m(SourceClass s, Wrapper w) {
w.setP1(s.getP1());
w.setP2(s.getP2());
}
问题已解决
**完整代码:
interface Wrapper {
void setP1(String p1);
void setP2(String p2);
}
class ClassAWrapper implements Wrapper{
ClassA classA;
ClassAWrapper(ClassA classA){
this.classA = classA;
}
@Override
public void setP1(String p1)
{
classA.setP1(p1);
}
@Override
public void setP2(String p2)
{
classA.setP2(p2);
}
}
class ClassBWrapper implements Wrapper{
ClassB classB;
ClassBWrapper(ClassB classB){
this.classB = classB;
}
@Override
public void setP1(String p1)
{
classB.setP1(p1);
}
@Override
public void setP2(String p2)
{
classB.setP2(p2);
}
}
class ClassA {
void setP1(String p1) {
System.out.println("ClassA - " + p1);
}
void setP2(String p2) {
System.out.println("ClassA - " + p2);
}
}
class ClassB {
void setP1(String p1) {
System.out.println("ClassB - " + p1);
}
void setP2(String p2) {
System.out.println("ClassB - " + p2);
}
}
class SourceClass {
String getP1() {
return "p1";
}
String getP2() {
return "p2";
}
}
void m(SourceClass s, Wrapper w) {
w.setP1(s.getP1());
w.setP2(s.getP2());
}
发布于 2016-02-25 05:37:46
为什么不简单地测试instanceof
呢?
例如:
void m (SourceClass s, Object a_or_b) {
if (a_or_b instanceof ClassA) {
// do blahA
}
if (a_or_b instanceof ClassB) {
// do blahB
}
}
https://stackoverflow.com/questions/35619005
复制