Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Dynamic binding


Автор: ressac 4.12.2008, 01:17
вот прочитал,
http://en.wikipedia.org/wiki/Dynamic_binding

но так ничего и не понял, не поможет-ли кто наглядным примером ?

Автор: ressac 4.12.2008, 13:36
ну что кто-то поможет? smile

Автор: rygel 4.12.2008, 13:53
довольно пространный вопрос. что именно не понятно? как работает полиморфизм?

при динамическом связывании выбор метод какого объекта выполнить производится во время работы приложения.

Наглядный пример приведен в статье. 

void kill(Mortal m) {
  m.die();
}

Методу передается параметр типа Mortal (который является интерфейсом). И на этапе компиляции невозможно узнать метод какого фактического типа необходимо вызвать... передадут ли методу объект типа Plant или Person.


Ну а например если бы у нас был только класс Person объявленный как final:
void kill(Person m) {
  m.die();
}

То в даннм случае использовалось бы статическое связывание на этапе компиляции, так как точно известно что Person не расширяемый, и ссылки на объекты будут только этого типа. 


На русском... довольно подробно
http://www.intuit.ru/department/pl/csharp/18/5.html

Автор: ressac 5.12.2008, 20:11
это как в песне , "нет, ну всё понятно, но что конкретно ты имела в ввиду?" smile

я понимаю что что есть интерфейс и два класса

а где находится метод килл? в каждом из классов ?

Автор: rygel 5.12.2008, 20:37
да. в каждом из классов.

Автор: ressac 5.12.2008, 21:07
http://img379.imageshack.us/my.php?image=71630824hi2.jpg
такая схема выходит?

теперь я в ступоре

ну вот


        Mortal human = new Person();
        Mortal rose = new Flower();

        rose.kill(rose); ---> смысл?


Автор: rygel 5.12.2008, 21:26
сорри. не метод kill, а метод die в каждом из классом.

Автор: ressac 5.12.2008, 21:30
в килл где тогда?:

Автор: rygel 5.12.2008, 23:14
Код

public interface Mortal {
    void die();
}


Код

public class Flower implements Mortal{
    public void die() {
        System.out.println("...");
    }
}


Код

public class Person implements Mortal {
    public void die() {
        System.out.println("Bye");
    }
}


Код

public class Dead {
    public void kill(Mortal mortal) {
        mortal.die();
    }
}


Код

public class Destiny {

    private List<Mortal> listOfMortals= new ArrayList<Mortal>();

    public static void main(String[] args) {
        Destiny destiny = new Destiny();
        destiny.born();
        destiny.dying();
    }

    public void born() {
        listOfMortals.add(new Person());
        listOfMortals.add(new Flower());
    }

    public void dying() {
        Dead dead = new Dead();
        for (Mortal mortal : listOfMortals) {
            dead.kill(mortal);
        }
    }

}

Автор: ressac 6.12.2008, 15:56
ok, thx

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)