如何根据构造函数重写方法



好的,所以我不确定这个问题是否已经存在,因为我不知道如何格式化它,但问题是:同一个方法会根据构造函数产生不同的结果吗?(如果我重复了这个问题,或者这是一个愚蠢的问题,我道歉。)

例如,假设我有一个具有函数public void foo();的接口MyInterface。假设我们有课:

public class MyClass implements MyInterface {
    public MyClass() {
        // I want foo() to print "Empty constructor" with sysout.
    }
    public MyClass(int x) {
        // I want foo() to print "Constructor with int" with sysout.
    }
}

所以现在,如果创建两个引用MyClass mc1 = new MyClass();MyClass mc2 = new MyClass(5);,然后调用mc1.foo();mc2.foo();,结果应该是:

空构造函数。

具有内部的构造函数

我尝试在构造函数中使用new MyInterface { @Override public void foo() { ... } },但似乎不起作用。

是。存储变量并在foo方法中进行检查。

public class MyClass implements MyInterface {
    private int x;
    public MyClass() {
        // I want foo() to print "Empty constructor" with sysout.
    }
    public MyClass(int x) {
        // I want foo() to print "Constructor with int" with sysout.
        this.x = x;
    }
    public void foo(){
       if(x > 0)
          System.out.println("Constructor with int");
       else
          System.out.println("Empty constructor");
    }
}

回答这个问题:据我所知,不是。或者至少不是直接地,您可以开始读取字节码,并在运行时对其进行更改,使其适应——所以,答案是否定的。

现在奇怪的部分是overridedepending on constructor。它不在覆盖范围内。

根据CCD_ 10的状态来做不同事情的方法并不太奇怪。然而,使该方法成为类实例化方式的唯一性,我从未听说过。话虽如此,这里有一个相当丑陋的解决方案

public class Test
{
    private final boolean intConstructorUsed;
    public Test () {
        intConstructorUsed = false;
    }
    public Test (int x) {
        intConstructorUsed = true;
    }
    public void foo () {
        if (intConstructorUsed == true) {
            // do this
        } else {
            // do that
        }
    }
}

foo方法并不奇怪。奇怪的是,根据哪一个构造函数,你基本上必须有不同的foo实现,你确定你不希望后面有一个abstract class,除了一个你覆盖的abstract void foo ()之外,所有的共享方法都有吗?当然,这些类看起来几乎完全相同,但事实并非如此,因为它们不共享foo ()

是的,这就是多个构造函数的设计目的,通过创建对象来允许变化。

public class MyClass implements MyInterface {
    private final String message;
    public MyClass() {
        message = "Empty constructor";
    }
    public MyClass(int x) {
        message = "Constructor with int";
    }
    @Override
    public void foo() {
        System.out.println(message);
    }
}

它甚至可以穿得很安全。

这里需要注意的是,该方法的实现完全相同,变体在构造函数中。构造函数的调用方式不同,这取决于调用者想要发生什么。

最新更新