没有实现抽象类中的方法(并使其无法访问)

时间:2019-04-24 11:33:50

标签: java interface abstract-class default visibility

我正在尝试创建一些Java类,这些Java类之间具有某些共享方法,而另一些仅适用于其中一些类的方法(并且这些方法中的每一个都应该是不同的)。

我做了一些研究,发现可以使用Interface方法开发default或使用abstract方法开发abstract类。

我的问题是我想使那些未实现的方法在使用类时不可用。我看到了这个answer,但我认为为未实现的方法抛出Exception有点过分。下面是我正在测试的代码。

可用方法:

public abstract class AvailableMethods {

    // This is the shared method
    void methodOne(){
        System.out.println("Common method implementation");
    }

    // This should always be implemented and have always different logic
    abstract int methodTwo();

    /* This should be only implemented in some cases and when not 
       implemented it should not be visible while using the class */
    abstract String methodThree();

}

A级:

public class ClassA extends AvailableMethods {

    @Override
    public int methodTwo() {
        return 123;
    }

    @Override
    public String methodThree() {
        return "test";
    }
}

ClassB:

public class ClassB extends AvailableMethods {
    @Override
    public int methodTwo() {
        return 456;
    }

    // I was trying to get rid of this implementation without defining a default value
    @Override
    public String methodThree() {
        return null;
    }
}

测试:

public class Test {

    public static void main(String[] args){
        ClassA a = new ClassA();
        ClassB b = new ClassB();

        b.methodOne();
        b.methodTwo();
    }

}

基本上我想要实现的是在我的IDE中键入b.时不建议/不可用。

我不知道是否有可能。我还尝试了methodThree接口方法,但没有成功。我不确定这是否是一个分层问题(也许我应该实现不同的类,并从其他类中扩展类,从而限制了方法的可见性),但是对于我而言,如果没有太多的类/接口,就没有一种实现方法,这似乎有些奇怪

1 个答案:

答案 0 :(得分:0)

在这里,我为您准备了一个小样本。

public class Example {

    public static void main(){
        ClassA a =  new ClassA();
        a.methodOne();
        a.methodTwo();
        a.methodThree();

        ClassB b =  new ClassB();
        b.methodOne();
        b.methodTwo();

    }
}

interface One {
    default void methodOne(){
        System.out.println("Common method implementation");
    }
}
abstract class Two implements One {
    public abstract void methodTwo();
}

interface Three {
    void methodThree();
}

class ClassA extends Two implements  Three{
    public void methodTwo() {}
    @Override
    public void methodThree() {}
}

class ClassB extends Two {
    public void methodTwo() {}
}