У вас должен быть абстрактный метод в суперклассе для включения позднего связывания - PullRequest
0 голосов
/ 17 июня 2020

Допустим, у меня есть абстрактный суперкласс. И все мои подклассы имеют метод publi c под названием toString(). Но разные подклассы должны иметь разные определения для метода toString(). Я хочу использовать позднее связывание. Вопрос в том, должен ли я иметь абстрактный метод в суперклассе с именем toString() для включения позднего связывания в подклассе? Или я могу просто написать разные toString() методы для каждого подкласса, не создавая такой абстрактный метод в суперклассе?

Ответы [ 2 ]

0 голосов
/ 17 июня 2020

Поздняя привязка происходит, когда компилятор не может разрешить вызов / привязку во время компиляции.

Вернемся к вашему вопросу, независимо от выбранного вами примера переопределения toString(), вы можете добиться позднего связывания, создав абстрактный класс, поскольку вызываемый метод toString() будет обнаружен во время выполнения.

PS:

Я предполагаю, что вы объявите свою переменную, используя свой класс abtract:

AbtractClass child1 = new SubClass1();
AbtractClass child2 = new SubClass2();

, но если вы объявите using subclassed, выполненный toString() будет известен во время компиляции:

SubClass1 child1 = new SubClass1();
SubClass2 child2 = new SubClass2();
0 голосов
/ 17 июня 2020

Я думаю, вы ищете «ленивую оценку» и / или «мемоизацию». Затем вы можете реализовать toString () в суперклассе с абстрактным методом для вычисления String и потребовать подклассы для реализации этого метода:

public abstract class Superclass {                                              
    private String string = null;                                               

    @Override                                                                   
    public String toString() {                                                  
        if (string == null) {                                                   
            string = calculateString();                                         
        }                                                                       

        return string;                                                          
    }                                                                           

    protected abstract String calculateString();                                
}                                                                               

public class Subclass extends Superclass {                                      
    @Override                                                                   
    protected String calculateString() {                                        
        return "This is the subclass string";                                   
    }                                                                           
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...