Вопрос по java – Может ли Java вызвать родительский переопределенный метод в других объектах, но не в подтипе?

35

здесь работает код Java

class Cup {
    public String sayColor() {
        return "i have a color .";
    }
}

class TCup extends Cup{
    public String sayColor(){
        System.out.println(super.getClass().getName());
        return super.sayColor()+"color is tee green.";
    }
}

class MyTCup extends TCup {
    public String sayColor(){
        System.out.println(super.getClass().getName());
        return super.sayColor()+"but brushed to red now!";
    }
}
class Test {
    public static void main(String[] args) {
        Cup c = new MyTCup();
        System.out.print(c.sayColor());
    }
}

и запуск тестовых отпечатков класса

MyTCup
MyTCup
i have a color .color is tee green.but brushed to red now!

Вопрос 1: Во время выполнения типом объекта C является MyTCup, но он всегда может вызывать супер-метод. Есть ли в MyTCup стек методов в памяти после инициализации объекта, а затем он может вызываться во время выполнения, как код?

вопрос 2: Нет никакого способа вызвать метод super в других объектах. Как я знаю, c ++ может привести к вызову родительского метода в любое время. Почему такой дизайн Java?

Вы, вероятно, должны принять ответ, как только вы будете удовлетворены им :) Narendra Pathai

Ваш Ответ

4   ответа
0

На самом деле вы можете, но вы должны использовать методологию, чтобы она работала только с вашим кодом.
В суперклассе добавьте параметр «Класс» к методу, как в:

public String sayColor(Class classFilter){...

теперь при каждом переопределении вы проверяете, является ли текущий подкласс одним из указанных фильтров, например:

if(TCup.class!=classFilter)return super.sayColor(classFilter);
return "some text for TCup only";

Я кодировал эксклюзивным способом. Вы можете добавить больше параметров или сравнить с нулем, чтобы объединить результаты с суперклассами, использовать свое творчество :)

0

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

68

Вы не можете вызывать метод super в других объектах - это нарушит инкапсуляцию. Все дело в том, что объект управляет тем, что делают его переопределенные методы. Например, вы можете переопределить коллекциюadd метод, чтобы вызвать исключение при определенных обстоятельствах, чтобы он мог обеспечить только «действительный» предметы были добавлены в коллекцию. Это было бы бессмысленно, если бы абоненты могли просто обойти это с актерами!

Единственная причина, по которой объект вызываетsuper.foo() само по себе - включить один вызов с помощью родительской реализации. Это зависит от кода в классе, чтобы убедиться, что он только когда-либо делает это разумно. Снова, чтобы взять пример надстройки в коллекции, если коллекция переопределяетadd это должно было бы иметьsome способ добавления проверенного элемента в коллекцию, который он будет делать сsuper.add().

Обратите внимание, что по той же причине инкапсуляции, вы можетеonly вызовите родительскую реализацию, а не реализацию прародителя - такsuper.foo() действителен, ноsuper.super.foo() ISN & APOS; т.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded sting
Error: User Rate Limit Exceededstackoverflow.com/questions/586363/…Error: User Rate Limit Exceeded
1

1:

Ваш вопрос не совсем понятен. Что вы подразумеваете под "вызовом во время выполнения, например, кодом"? Если вы спрашиваете, как экземпляр c знает, что такое его суперкласс, то да, иерархия классов хранится в памяти и может быть доступна для виртуальной машины.

2:

Java на самом деле позволяет вам приводить экземпляр к его родителю. Просто вызов метода для экземпляра всегда использует фактический класс экземпляра, а не его класс времени компиляции. То есть в Java все методы называются «виртуальными»; в C ++. Почему это было решено, я не знаю.

Edit: На самом деле Джон Скит очень хорошо объясняет, почему вы не можете вызвать метод суперкласса для экземпляра подкласса, так что теперь я знаю :-).

Error: User Rate Limit Exceeded sting

Похожие вопросы