Не реализует метод из абстрактного класса (и делает его недоступным) - PullRequest
0 голосов
/ 24 апреля 2019

Я пытался создать некоторые классы Java с некоторыми общими методами среди них и с некоторыми другими методами, доступными только для некоторых из этих классов (и каждый из этих методов должен быть различным).

Я провел некоторое исследование и обнаружил, что могу разработать Interface с default методами или abstract класс с abstract методами.

Моя проблема в том, что я хотел бы сделать эти нереализованные методы недоступными при использовании класса. Я видел этот ответ , но я думаю, что это немного излишне, бросать Exception для неосуществленных методов. Ниже приведен код, который я тестировал.

AvailableMethods:

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();

}

ClassA:

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();
    }

}

По сути, я хотел, чтобы при вводе b. в моей IDE methodThree не предлагалось / не было доступно.

Я не знаю, возможно ли это. Я также попробовал с default методы интерфейса без успеха. Я не уверен, является ли это иерархической проблемой (может быть, мне следует реализовать разные классы и расширить те из них, которые ограничивают видимость методов), но мне кажется немного странным отсутствие существующего способа сделать это без слишком большого количества классов / интерфейсов .

1 Ответ

0 голосов
/ 24 апреля 2019

Вот, пожалуйста, я выложил небольшой образец для вас.

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() {}
}
...