Если у меня есть метод в подклассе, который запрашивает объект суперкласса, как я могу различить оба? - PullRequest
0 голосов
/ 26 июня 2018

Что я имею в виду, если у меня есть A obj1 = new B(); A obj2 = new B();, я хочу знать, как вызывать один и тот же метод для обоих объектов, а также знать, как узнать, какой объект вызывает метод и когда:

Например, допустим, что моя иерархия классов выглядит примерно так:

abstract class A {
    public void method_1() {
        //Do something
    }
}

class B extends A {
    public boolean method_2(A obj) { 
        //Do something
    }
}

Если я где делать obj1.method_2(obj2); Как мне внутри method_2(), когда я его кодирую, чтобы и obj1, и obj2 вызывали method_1(), различали, какой объект вызывает метод?

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

Ответы [ 3 ]

0 голосов
/ 26 июня 2018
public class Main {

    public static void main(String arg[] ) {
        A obj1 = new A() {};
        A obj2 = new B();
        B obj3 = new B();

        obj1.method_1("1 "+obj1.getClass());
        obj2.method_1("2 "+obj2.getClass());

        obj3.method_1("3 "+obj3.getClass());

        obj3.method_2(obj1);

        obj3.method_2(obj2);
    }

}


abstract class A {
    public void method_1(String className) {//Do something
        System.out.println("A.method_1() called by "+className);
    }
}


class B extends A {
    public boolean method_2(A obj) {//Do something
        super.method_1("4 "+obj.getClass());
        obj.method_1("5 "+obj.getClass());

        return true;
    }
}
0 голосов
/ 26 июня 2018

Вы НЕ можете создать объект класса A в качестве его абстрактного класса. Однако вы можете создать объект B и передать его вместо A в method_2 (). Когда вы вызываете method_1 () внутри method_2 (), вы все равно вызываете его через объект класса B. Вот тестовая программа, которую я мог написать, основываясь на моем понимании вашего вопроса -

public class App {

    public static void main(String[] args) {

        B b = new B();
        B b2 = new B();
        b.method_2(b2); //Or
        //b.method_2((A)b2);

    }

}

abstract class A {
    public void method_1() {
        System.out.println("In method_1 = " + this.getClass());

    }
}

class B extends  A {
    public boolean method_2(A a) {
        System.out.println("In method_2 = " + this.getClass());
        a.method_1();
        return false;

    }
}

В результате оба метода вызываются объектом класса B. Вы можете использовать метод getSuperClass (), чтобы получить имя суперкласса.

0 голосов
/ 26 июня 2018

obj1, который является экземпляром B, но ссылается на класс A, не будет иметь доступа к method_2 Так что вам нужно разыграть как это

((B) obj1).method_2(obj2);

или вы можете изменить ссылку на B вместо A

B obj1 = new B();

Базовая ссылка не может вызвать метод ребенка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...