如何在不重复代码的情况下继承它

时间:2011-07-14 18:45:24

标签: java subclass

我的课程Dad包含子类Son。我想创建一个Dad的子类和一个Son的子类来覆盖Dad的方法。

如果不重复代码,最好的方法是什么?我无法修改DadSon

...鉴于

public class Dad {

public void doSomething() {}

}

public class Son extends Dad {

}

......我想创造......

public class DadSubclass extends Dad {

@Overrides
public void doSomething() {        
    // My code 
}

}

public class SonSubclass extends Son {

@Overrides
public void doSomething() { 
    // My code 
}

}

...不重复// My code

显而易见的解决方案是创建一个帮助器类并为它们调用它,但如果我想调用受保护的方法,那么这是有问题的,而且我不允许使用相同的包创建子类。

有更好的解决方案吗?

4 个答案:

答案 0 :(得分:3)

创建一个公共助手类并调用它。

答案 1 :(得分:3)

假设您的代码没有访问成员变量,我只想将此代码放在静态实用程序类中。如果不是这种情况,您仍然可以通过传入一个共同的超类 - “爸爸”public static void mycode(Dad d)来实现这一点。如果您需要在子类本身中使用特定变量,我会重新考虑您的类结构。

答案 2 :(得分:0)

你真正想要的是这样的事情:

class DadSonSubclass extends Dad, Son {
    public void doSomething() {
        //mycode
    }
}

这是多重继承,Java不支持。因此,您唯一的选择是创建一个助手/实用程序类,这是完全可以接受的。如果需要调用protected方法,只需将Dad对象传递给helper类并创建公共回调方法即可访问此信息。

答案 3 :(得分:0)

可能更好,也许不是,取决于你的观点,但它肯定可以完成。将您的代码放入一个帮助器类中,并使用一个回调来让该帮助程序访问它所需的受保护方法:

interface Callback {
    void foo();
    void bar();
    void one();
    void two();
}

class Helper {
    static void helpMe(Callback callback) {
        // My code
    }
}

class DadSubclass extends Dad {
    @Override
    public void doSomething() {
        Helper.helpMe(new Callback() {
            public void foo() {
                DadSubclass.this.foo();
            }

            public void bar() {
                DadSubclass.this.bar();
            }

            public void one() {
                throw new UnsupportedOperationException("one() doesn't exist in Dad");
            }

            public void two() {
                throw new UnsupportedOperationException("two() doesn't exist in Dad");
            }
        });
    }
}

class SonSubclass extends Son {
    @Override
    public void doSomething() {
        Helper.helpMe(new Callback() {
            public void foo() {
                SonSubclass.this.foo();
            }

            public void bar() {
                SonSubclass.this.bar();
            }

            public void one() {
                SonSubclass.this.one();
            }

            public void two() {
                SonSubclass.this.two();
            }
        });
    }
}