Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现继承没有父类或接口_Java_Inheritance - Fatal编程技术网

Java 实现继承没有父类或接口

Java 实现继承没有父类或接口,java,inheritance,Java,Inheritance,我有以下两种方法: void m1(SourceClass s, ClassA a); void m2(SourceClass s, ClassB b); ClassA和ClassB实际上共享一些公共属性,但是,我们无法编写另一个父类&使ClassA和ClassB从父类继承,因为ClassA和ClassB不受我们的控制 问题:没有重复代码,如果类别A。。。否则如果B类。。。 为了达到编写继承的新父类的效果,处理这种情况的最佳方法是什么?谢谢。有一个非常好的设计模式可以解决: 将其他职责动态附

我有以下两种方法:

void m1(SourceClass s, ClassA a);
void m2(SourceClass s, ClassB b);
ClassA和ClassB实际上共享一些公共属性,但是,我们无法编写另一个父类&使ClassA和ClassB从父类继承,因为ClassA和ClassB不受我们的控制

问题:没有重复代码,如果类别A。。。否则如果B类。。。
为了达到编写继承的新父类的效果,处理这种情况的最佳方法是什么?谢谢。

有一个非常好的设计模式可以解决:

  • 将其他职责动态附加到对象。装饰器为扩展功能提供了一种灵活的子类化替代方法
  • 客户端通过递归地包装核心对象来指定核心对象的修饰
  • 包装礼物,把它放在盒子里,然后包装盒子
注意:在单独的类中提取公共代码片段,并动态更改对象的行为

例如:

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");
   }
}

编辑: 以下是符合您要求的完整示例代码,包括步骤:

步骤:

创建具有公共方法签名的接口
包装器

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);
    }
}
现在更改方法签名,如

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

为什么不简单地测试一下
的instanceof

e、 g


谢谢你的回复。更清楚地说,我必须修改以下当前代码:void m1(SourceClass s,ClassA){a.setP1(s.getP1();a.setP2(s.getP2());}void m2(SourceClass s,ClassA b){b.setP1(s.getP1());b.setP2(s.getP2());}-->这里的要点是:我希望在不修改ClassA和ClassB签名的情况下消除重复代码。谢谢
void m (SourceClass s, Object a_or_b) {

    if (a_or_b instanceof ClassA) {
        // do blahA
    }
    if (a_or_b instanceof ClassB) {
        // do blahB
    }
}