相关疑难解决方法(0)

在任何派生类的构造函数之后运行方法

假设我有一个Java类

abstract class Base {
    abstract void init();
    ...
}
Run Code Online (Sandbox Code Playgroud)

而且我知道每个派生类都必须init()在它构造之后调用.当然,我可以简单地在派生类的构造函数中调用它:

class Derived1 extends Base {
    Derived1() {
        ...
        init();
    }
}

class Derived2 extends Base {
    Derived2() {
        ...
        init();
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会破坏"不要重复自己"的原则而且会很糟糕(而且会有很多子类Base).当然,init()调用不能进入Base()构造函数,因为它会被执行得太早.

任何想法如何绕过这个问题?我也很高兴看到Scala解决方案.

更新:这是工厂方法方法的通用版本:

interface Maker<T extends Base> {
    T make();
}

class Base {
    ...
    static <T extends Base> T makeAndInit(Maker<T> maker) {
        T result = maker.make();
        result.init();
        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

更新2:这个问题基本上是"你如何使用模板方法为构造函数"?答案似乎是,"你可以,但这是一个坏主意".所以我可以做一个模板工厂(模板方法+抽象工厂).

java oop scala

22
推荐指数
3
解决办法
1万
查看次数

基础构造函数的Java调用基方法

如何从Super :: Super()调用Super :: printThree?
在下面的例子中,我改为调用Test :: printThree.

class Super {
        Super() { 
        printThree(); // I want Super::printThree here!
        }
        void printThree() { System.out.println("three"); }
}
class Test extends Super {
        int three = 3
        public static void main(String[] args) {
                Test t = new Test();
                t.printThree();
        }
        void printThree() { System.out.println(three); }
}

output:
0    //Test::printThree from Super::Super()
3    //Test::printThree from t.printThree()
Run Code Online (Sandbox Code Playgroud)

java inheritance

0
推荐指数
1
解决办法
624
查看次数

标签 统计

java ×2

inheritance ×1

oop ×1

scala ×1