|
|
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
Добрый день. Возник вопрос по поводу полиморфизма: что это и в чем "сила". Подскажите, прав ли я. Предположим, есть базовый класс A: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. Есть класс-наследник B: Код: plaintext 1. 2. 3. 4. 5. В главном классе MainClass я создаю объекты классов A и B: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Так вот при создании ссылки на объект класса B и будет работать полиморфизм, т.е. выполнится конструктор класса A, а потом метод из класса B (еще это в литературе называют поздним связыванием). Прав ли я ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 16:38 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
при new B() конструктор A() не выполнится фишка в том, что вы можете написать A a = new B() а потом вызывать методы как класса A так и B при помощикаста ((B)a).showMsg(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 18:52 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
далай > а потом вызывать методы как класса A так и B при помощикаста > ((B)a).showMsg(); не получится вызвать методы класса A. автоматически выполнится метод класса B ----------------------------------- The Bat + My Gate Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 19:02 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
Полиморфизм это возможность использовать одноименные методы с одинаковым или различным набором параметров в группе классов связанных отношением наследования. В свою очередь, понятие полиморфизма опирается на 2 других понятия : - совместное использование (одноименные методы с различным набором параметров) Например : Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. - переопределение (одноименные методы с одинаковым набором параметров) Например Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Ссылка а формально имеет тип A, но ссылается на объект класса B. В Java выполняется вызов метода данного объекта с учетом того, что объект может быть не того же класса, что и ссылка, указывающая на него. Т.е. выполняется вызов метода того класса, к которому реально относится объект. Это — динамический полиморфизм методов. Он называется поздним связыванием (dynamic binding, late binding, run-time binding). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 19:09 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
далайпри new B() конструктор A() не выполнится фишка в том, что вы можете написать A a = new B() а потом вызывать методы как класса A так и B при помощикаста ((B)a).showMsg(); Интересно а как будут инициализироваться данные базового класса, если не конструктором по умолчанию% ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 19:29 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
JGuestТак вот при создании ссылки на объект класса B и будет работать полиморфизм, т.е. выполнится конструктор класса A, а потом метод из класса B (еще это в литературе называют поздним связыванием). Потенциально перегружаемые методы из конструктора вызывать нельзя. Конкретно этот код работает случайно - он не пользуется полями класса. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2006, 19:42 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
при new B() конструктор A() не выполнится фишка в том, что вы можете написать A a = new B() а потом вызывать методы как класса A так и B при помощикаста ((B)a).showMsg(); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 09:12 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
блин. нажал рефрешь, а оно запостилось еще раз... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 09:14 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
>не получится вызвать методы класса A. автоматически выполнится метод класса B точно. я фигню сказал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 09:40 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
далай>не получится вызвать методы класса A. автоматически выполнится метод класса B точно. я фигню сказал кстати, утверждение неверно для статических методов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 12:29 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
Deady далай>не получится вызвать методы класса A. автоматически выполнится метод класса B точно. я фигню сказал кстати, утверждение неверно для статических методов. фигня заключается в том, что статические методы не наследуются? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 14:31 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
NotGonnaGetUs фигня заключается в том, что статические методы не наследуются? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. The title of this puzzle gives a big hint. The problem is that bark is a static method, and there is no dynamic dispatch on static methods [JLS 15.12.4.4]. When a program calls a static method, the method to be invoked is selected at compile time, based on the compile-time type of the qualifier, which is the name we give to the part of the method invocation expression to the left of the dot. In this case, the qualifiers of the two method invocations are the variables woofer and nipper, both of which are declared to be of type Dog. Because they have the same compile-time type, the compiler causes the same method to be invoked: Dog.bark. This explains why the program prints woof woof. It doesn't matter that the runtime type of nipper is Basenji; only its compile-time type is considered. из книги Java? Puzzlers: Traps, Pitfalls, and Corner Cases, puzzle #48 ----------------------------------- The Bat + My Gate Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 14:47 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
SherstПолиморфизм это возможность использовать одноименные методы с одинаковым или различным набором параметров в группе классов связанных отношением наследования. В свою очередь, понятие полиморфизма опирается на 2 других понятия : - совместное использование (одноименные методы с различным набором параметров) - переопределение (одноименные методы с одинаковым набором параметров) Пункт про "совместное использование" к полиморфизму не имеет никакого отношения. Это просто сахар, позволяющий тратить меньше времени на выдумываение имён для методов (далеко не факт, что это хорошо). Полиморфизм совместно со статическим связыванием - это нонсенс (или С++), т.к. является просто способом разрешения конфликта имён возникающего при наследовании. Собственно, полиморфизм - это возможность изменить реализацию метода из родительского класса. Очевидно, что выбор реализации полиморфного метода должен осуществляться на основе "динамического" или "реального" типа объекта, что никак не вяжется ни со статическим связыванием, ни с возможностью иметь в классе методы с одниковыми названиями. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 14:48 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
Deady NotGonnaGetUs фигня заключается в том, что статические методы не наследуются? из книги Java? Puzzlers: Traps, Pitfalls, and Corner Cases, puzzle #48 Предлагаешь мне повторить вопрос? :) Статические методы не наследуются. Согласно терминологии JSL они "скрываются" в классах наследниках. Для разрешения конфликта имён, возникающего из-за существования двух методов с одинаковой сигнатурой в классе используется тип переменной. При чём тут полиморфизм? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 14:52 |
|
||
|
Полиморфизм
|
|||
|---|---|---|---|
|
#18+
JGuest спрашивал, в чем сила, братья? поэтому надо объяснять понятно, на примерах, так чтобы даже я понял. к примеру: мы можем в основном классе реализовать основные методы работы с базой данных. но каждый сервер базы данных требует, чтобы с ним общались по своему протоколу. поэтому мы пишем несколько наследников к нашему основному классу, в которых в тех же методах реализованы разные последовательности слов, которые надо говорить в сокет, и разбор разных видов ответов сервера. интерфейс (набор публичных методов) у всех наследников одинаковый, а делают они все разное. получаются драйвера разных баз данных. и мы можем в нашей программе делать Class.forName(названиеДрайвераИзКонфига), подставляя в конфиге разные драйвера для разных серверов баз данных! вот это сила. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2006, 16:37 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=33606091&tid=2149895]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
442ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 232ms |
| total: | 778ms |

| 0 / 0 |
