В каких ситуациях можно вызывать методы одного класса для объектов другого? - PullRequest
2 голосов
/ 13 марта 2019

Я новичок в Java, поэтому я все еще изучаю правила работы на строго объектно-ориентированном языке. Сегодня мне было интересно использовать метод для работы с объектами вне класса этого метода. Возможно ли при любых обстоятельствах успешно выполнить операции над объектом с помощью метода из другого класса?

Скажем, у меня есть объект anchorPane (javafx). Было бы неразумно пытаться вызвать для него метод setText () класса Text, поскольку anchorPanes не отображают текст напрямую.

Но есть ли ситуации, в которых такое возможно? Всегда ли правило, что методы могут влиять только на объекты своего класса?

Ответы [ 2 ]

1 голос
/ 13 марта 2019

Всегда ли правило, что методы могут влиять только на объекты своего класса?

не напрямую, но если вы пометите метод как protected , метод может быть вызван только из объектов того же класса и объектов из производных классов (даже в других экземплярах). Смотри также https://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

Кроме того, вы можете сделать его окончательным, чтобы невозможно было отменить метод (и если вы сделаете свой класс окончательным, никто не сможет извлечь его из вашего класса). в этом случае вы получите именно то, что описали:

//final here disallows to subclass "Sample". This assures that there exists NO subclass that invokes bar().
public final class Sample {


    public void foo() {

        //on same instance
        this.bar();

        //on another instance, but just same class (or subclass of Sample, but not possible because class is final)
        Sample b = new Sample();
        b.bar();
    }

    /*final here prevents that METHOD is overwritten. But class can be overwritten.
     * subclasses are also allowed to invoke bar().
     */
    protected final void bar() {
        //do something here
    }
}
0 голосов
/ 13 марта 2019

В каких ситуациях методы одного класса могут вызываться для объектов другого?

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

Java, являющийся типобезопасным языком, не позволяет вам вызывать метод, написанный для определенного класса, для чего-то, что не является экземпляром этого класса (то, что вы могли бы сделать в Javascript, например, используя bind(iWantThisThis)).

Невозможно вызывать эти методы в случаях совершенно не связанных классов. Они должны быть из этого класса или из подкласса.

Итак, нет, вы не можете вызвать Text::getText для экземпляра несвязанного AnchorPane.

Вы можете вызывать общие методы из общего родительского интерфейса или суперкласса. Например, оба anchorPane.toString() и text.toString() будут работать (потому что каждый объект в Java имеет эти методы). Если оба AnchorPane и Text реализуют гипотетический интерфейс UIComponent, возможно, на обоих из них может быть метод getSize().


То, что вы ищете, называется делегированием или составлением объекта. Если у вас есть AnchorPane, который отображает Text, вы можете дать ему метод, который также называется setText, которому делегирует вызов метода для экземпляра Text, содержащегося в AnchorPane .

class AnchorPane {
    private final Text myText;
    void setText(String newText){
      myText.setText(myText);
    }
}

Так что теперь у вас также есть метод setText для AnchorPane (но вам пришлось добавить его вручную, чтобы указать, что именно он делает, и он не дает вам ни одного из других методов).

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