代码之家  ›  专栏  ›  技术社区  ›  h_k

Java继承-两个使用相同方法的类

  •  2
  • h_k  · 技术社区  · 9 年前

    ObjectA 和 ObjectB MasterObject 。我还有一个接口,其中包含一个方法,我希望两者都包含 ObjectA公司 和 对象B .然后我有一个类,它有一个类型为的字段 主对象 ObjectA公司 和 对象B

    此外,我无法更改 班

    public interface MyInterface{
        void doSomething();
    }
    
    class ObjectA extends MasterObject implements MyInterface {
    
        @Override
        public void doSomething(){
            //...
        }
    }
    
    class ObjectB extends MasterObject implements MyInterface {
        @Override 
        public void doSomething(){
            //...
        }
    }
    
    class Main {
        MasterObject mObj;
    
        public void method1() {
            mObj = new ObjectA();
            mObj.doSomething();
        }
    
        public void method2() {
            mObj = new ObjectB();
            mObj.doSomething(); //runs code from ObjectB class
        }
    }
    

    现在,这显然引发了一些编译器问题。(无法解析方法doSomething())。

    ((ObjectA) mObj).doSomething(); 看起来很管用,但有没有其他方法可以不用浇铸就能做到这一点?有更干净的吗?

    4 回复  |  直到 9 年前
        1
  •  3
  •   CraigR8806    9 年前

    最后一个解决方案是创建代理抽象类 AbstractMasterObject 实现 MyInterface ObjectA ObjectB 拥有两者的全部功能 MasterObject 和 如果他们延长 抽象主对象

    可以这样做:

    public abstract class AbstractMasterObject extends MasterObject implements MyInterface{
    
    }
    

    AbstractMasterObject a = new ObjectA();
    AbstractMasterObject b = new ObjectB();
    
        2
  •  2
  •   Alberto Trindade Tavares    9 年前

    最干净的方法是将接口为类型的对象声明为:

    MyInterface mObj;
    

    您可以用相同的方式用具体类实例化对象:

    mObj = new ObjectA();
    ...
    mObj = new ObjectB();
    

    doSomething 方法,因为它是接口中定义的唯一方法。如果你只打算使用这种方法,那就是正确的选择。

        3
  •  1
  •   Nikolas Charalambidis    9 年前

    问题在于课堂 MasterObject MyInterface ,尽管他的孩子们知道。

    解决方案是实现接口:

    MyInterface mObj;
    mObj = new ObjectA();
    
        4
  •  1
  •   mymarkers    9 年前

    MasterObject 这种互动比 doSomething 。任何其他约束都可能决定哪一个最适合您。

    第一种选择是按照克雷格的建议创建中间层 AbstractMasterObject 延伸 并实施 MyInterface 。这是一种快速简便的方法,可以获得一个既可以是 主对象 我的接口 例子缺点是 Main 现在必须使用 主对象 主对象

    另一种选择是使用组合而不是继承。所以 ObjectA 和 ObjectB 每个都有一个 主对象 MasterClass 行为(为了简单起见,我只是展示 ObjectA公司

    class ObjectA implements MyInterface {
    
         private masterObject masterObject; 
    
         public ObjectA(MasterObject masterObject){
           this.masterObject = masterObject;
        }
        @Override
        public void doSomething(){ /* Implementation */ }
    
     }
    

    主要的 .你可以参考 大师班 主要的 并将其传递给 ObjectA公司 大师班 和

    class Main {
       MyInterface myInterface;
       MasterObject masterObject;
    
       public void method1(){
          masterObject = new MasterObject();
          myInterface = new ObjectA(masterObject);
    
          myInterface.doSomething();
          masterObject.someMasterObjectMethod();
    
       }
    }
    

    这种方法只有在以下情况下才有效 两者都不覆盖 主对象 主对象 在两者中 和 主对象 然后你可能会遇到一些棘手的错误。另一方面,如果这些都不是问题,那么这可能是一个好方法。它补充道 我的接口 到 主要的 不中断 主对象 它使用 间接实施

    或者你可以躲起来 主对象 完全来自 只有通过 我的接口 。要做到这一点,您只需在 getMasterObject 我的接口 。或者您可以将方法添加到 具体涉及如何 主要的 与之互动。我认为这样的方法是最干净的,但它需要修改最多的代码。如果这主要是新开发,那么重构可能是值得的。如果是较旧的代码,那么我倾向于采用侵入性较小的方法。

    另一种选择是从稍微不同的方向来实现这一点。您完全按照定义的方式使用这些类。区别在于 具有两个 主对象 和 我的接口 指向同一实例的引用:

    class Main {
    
       private MasterObject masterObject;
       private MyInterface myInterface;
    
       public void method1(){
    
           ObjectA objectA = new ObjectA();
           masterObject = objectA; // Legal because ObjectA extends MasterObject
           myInterface = objectA; // Legal because ObjectA implements MyInterface
    
           myInterface.doSomething(); // This does ObjectA's implementation
           masterObject.someMasterObjectMethod();
    
       }
    }
    

    主要的 我的接口