Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];

Вниз

Виртуальные классы   Найти похожие ветки 

 
euru   (2003-11-12 15:37) [0]

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

Почему тогда нет виртуальных классов, в которых реализация класса не зависит от его декларации?


 
vuk   (2003-11-12 15:40) [1]

Виртуальные методы - всего лишь средство реализации полиморфизма. Разрыв каких-то там связей здесь ни при чем.


 
Кулюкин Олег   (2003-11-12 15:41) [2]


> Почему тогда нет виртуальных классов

А интерфейсы Вам не подойдут?


 
euru   (2003-11-12 15:48) [3]

vuk © (12.11.03 15:40) [1]
А что тогда такое полиморфизм?

Кулюкин Олег © (12.11.03 15:41) [2]
Нет. Потому что нельзя создать экземпляр интерфейса.


 
Mike B.   (2003-11-12 15:58) [4]

>euru © (12.11.03 15:37)
Интересно, как вы это себе представляете?


 
Reindeer Moss Eater   (2003-11-12 15:59) [5]

Почему тогда нет виртуальных классов, в которых реализация класса не зависит от его декларации?

Это как? В интерфейсной секции объявлено одно, а в реализации другое?
Так что ли?


 
ИдиотЪ   (2003-11-12 16:02) [6]

Удалено модератором
Примечание: Offtopic


 
han_malign   (2003-11-12 16:03) [7]

>euru © (12.11.03 15:37)
- это вопрос, или сарказм?

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

Скажите людям откуда цитата - чтобы знали, чего не нужно читать...

З.Ы. Вообще "виртуальный класс" - это синоним "полиморфного класса", все интерфейсные методы(public) которого виртуальные. Если базовый "виртуальный класс", не имеет ни каккой реализации (есть только методы объявленные - "...;virtual;abstract;"), такой класс называют - "абстрактный класс", или "класс с абстрактным интерфейсом"...


 
REA   (2003-11-12 16:04) [8]

Есть еще идея (не знаю уж насколько разумная) сделать наследование данных в базах данных.
Т.е. объявляется например существо с полями руки, ноги, хвост, на его базе человек (плюс мозг), на его базе доцент. Если характеристики нового объекта не заполнены, то берутся из предка.
(Вобщем сам не понял чего хотел)


 
euru   (2003-11-12 16:09) [9]

Я себе это представляю так: виртуальный класс - это такой класс, реализация которого привязывается не во время компиляции, а во время исполнения.


 
Кулюкин Олег   (2003-11-12 16:16) [10]


> Я себе это представляю так: виртуальный класс - это такой
> класс, реализация которого привязывается не во время компиляции

Мощно задвинул, внушает (с) Гоблин


 
NeyroSpace   (2003-11-12 16:18) [11]

>ИдиотЪ © (12.11.03 16:02) [6]
уже сделано, хотя и не компилятор.
посмотри в исходниках Innerfuse Pascal Script 3


 
arbiter   (2003-11-12 16:18) [12]

> euru © (12.11.03 16:09) [9]
Интерфейсы


 
Кулюкин Олег   (2003-11-12 16:20) [13]


> arbiter © (12.11.03 16:18) [12]
> Интерфейсы

Уже предлагал, отвергли :(


 
euru   (2003-11-12 16:25) [14]

>han_malign © (12.11.03 16:03) [7]
Это вопрос.

А почему, собственно, бред? Если метод виртуальный, то при его вызове будет вызываться реализация, зависящая от класса, в котором он реализован.


 
Dimka Maslov   (2003-11-12 16:27) [15]

Не путайте абстрактные классы (интерфейсы) и абстрактные методы с их виртуальными сородичами


 
ИдиотЪ   (2003-11-12 16:30) [16]

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


 
euru   (2003-11-12 16:39) [17]

Виртуальные классы позволили бы
1. уменьшить глубину иерархии классов
2. уменьшить "кустистость" иерархии классов
3. возможно, убрать противостояние между одиночным и множественным наследованием
4. и т.д.


 
ИдиотЪ   (2003-11-12 16:40) [18]

ту euru ©
чем аргументируешь твои пункты ?


 
y-soft   (2003-11-12 16:43) [19]

>euru © (12.11.03 16:39) [17]
Все это дают интерфейсы


 
han_malign   (2003-11-12 17:06) [20]

> Если метод виртуальный, то при его вызове будет вызываться реализация, зависящая от класса, в котором он реализован.
- и что, "разрывается жесткая связь между объявлением метода и его реализацией"??? Каким образом?

Имя метода совпадает, количество и тип параметров и возвращаемого значения совпадает, модуль в котором объявляется и реализуется перекрытие метода, тоже один - на мой взгляд, "связь между объявлением метода и его реализацией" - абсолютная.


 
han_malign   (2003-11-12 17:20) [21]

> 1. уменьшить глубину иерархии классов
> 2. уменьшить "кустистость" иерархии классов
- это называется класс с "толстым интерфейсом"((с)Страуструп), влечет за собой уменьшение гибкости и увеличение объема кода...

> убрать противостояние между одиночным и множественным наследованием
- никакого противостояния нет, множественное наследование - это, всего лишь, неявная(скрытая) аггрегация. Нужно просто знать когда можно использовать множественное наследование, а когда стоит сделать явную аггрегацию.

З.Ы. Как уже говорили выше, вам нужен OLE интерфейс, в котором есть полезный метод Dispatch.

З.З.Ы. Прежде чем выдвигать "гениальные" идеи, почитайте, для начала, что умные люди пишут, хотя бы, тот же Вирт и Страуструп.


 
euru   (2003-11-12 17:22) [22]

>ИдиотЪ © (12.11.03 16:40) [18]
1. Уменьшение глубины иерархии. Так как реализация класса не привязывается к его декларации, то не нужно будет создавать новый класс при изменении какого-либо метода. Достаточно будет указать классу, чтобы он использовал другую реализацию.
2. Уменьшение "кустистости" иерархии. Если нужно единообразно изменить какой-то метод всех потомков одного родителя, достаточно заменить реализацию родителя, а не порождать от каждого потомка новый класс.
3. Здесь пока на уровне интуиции :) Примеров нет.
4. Например. Есть 1000 объектов какого-то класса. Из них у 10 объектов поведение несколько отличается. Необязательно порождать новый класс. Достаточно заменить реализацию этим 10 ОБЪЕКТАМ.


 
euru   (2003-11-12 17:39) [23]

han_malign © (12.11.03 17:06) [20]

type
TA = class
procedure M(); virtual;
end;

TB = class(TA)
procedure M(); override;

. . .

procedure X(O: TA);
begin
O.M();
end;

В процедуре X() будет вызываться либо TA.M(), либо TB.M() - в зависимости от объекта O. Какой из этих методов вызовется, определяет компилятор. В дальнейшем может появиться новый класс (потомок TA или TB) с другой реализацией метода M(). Однако это не приведет к переписыванию процедуры X().

OLE - это технология, а не свойство языка.


 
Wizard_Ex   (2003-11-12 17:54) [24]

Удалено модератором
Примечание: Offtopic


 
Goffman   (2003-11-12 17:57) [25]

[22] euru © (12.11.03 17:22)
Все перечисленное легко уживается с концепцией интерфейса
[23] euru © (12.11.03 17:39)
Ошибаешься, компилятор понятия не имеет экземпляр какого потомка вы передадите в процедуру Х


 
han_malign   (2003-11-12 18:00) [26]

> procedure X(O: TA);
> begin
> O.M();
> end;
- вот о том я и говорю, сначала почитайте книги и разберитесь с терминологией - потому что O.M(); - это не реализация метода класса, а вызов метода экземпляра класса...


 
euru   (2003-11-12 18:07) [27]

>Goffman © (12.11.03 17:57) [25]
Не совсем удачно выразился. Конечно, компилятор не знает, какой объект будет передаваться в процедуру, но организация механизма вызова метода в зависимости от класса объекта лежит на нем, а не на программисте.


 
ИдиотЪ   (2003-11-12 18:32) [28]

ту euru ©
классы можно по разному проетировать снизу-вверх и наоборот.
Реализация со свойствами у Борланда прекрассный пример как можно экземпляры приспособить под конкретные нужды без необходимости писать потомков и менять реализацию их поведения


 
Goffman   (2003-11-12 18:41) [29]


> Конечно, компилятор не знает, какой объект будет передаваться
> в процедуру, но организация механизма вызова метода в зависимости
> от класса объекта лежит на нем, а не на программисте.

И что? на то он и компилятор:)
а как же ты собираешься вызывать методы своих, т.н. виртульных классов?
Invoke()? как у IDispatch?
:)


 
euru   (2003-11-13 09:45) [30]

>ИдиотЪ © (12.11.03 18:32) [28]
Если все так замечательно, то почему создаются новые классы, необходимые только для того, чтобы изменить поведение их родителя? Неужели это обязательное условие, чтобы, к примеру, для добавления 3-мерных эффектов классу TLabel нужно создавать новый класс T3DLabel?

>Goffman © (12.11.03 18:41) [29]
А как вызываются виртуальные методы? Мы же не задумываемся метод какого класса будет вызываться на самом деле.


 
[NIKEL]   (2003-11-13 10:08) [31]

Если все так замечательно, то почему создаются новые классы, необходимые только для того, чтобы изменить поведение их родителя? Неужели это обязательное условие, чтобы, к примеру, для добавления 3-мерных эффектов классу TLabel нужно создавать новый класс T3DLabel?

да потому что это концептуальная идея такая! это концепция классов!
так все и должно быть, если заложена в этот РОД,КЛАСС,СООБЩЕСТВО,КОЛЛЕКЦИЮ И Т.Д данная функциональность, то так и должно быть, класс определяется своими свойствами и событиями. Ты можешь определить ГРУППУ ОДИНАКОВЫХ объектов только потому, что они принадлежат одному классу! И ты 100% уверен, что у всех этих объектов ОДИНАКОВОЕ кол-во свойств и методов! И они все одинаково реализованы.

И если есть (надо сделать) какую то дополнительную\урезанную функционаьность то это уже будет ДРУГОЙ класс. А иначе ты не будешь уверен в функциональности данного класса. Если есть класс куколка, то он и до конца будет куколкой. И надо делать (наследовать) новый класс Бабочка. Надо явно определять где куколки, а где бабочки.


 
ИдиотЪ   (2003-11-13 10:09) [32]

euru ©
а давай, сделай супер класс, который все в себя заранее включает, что можно сделать.
Между прочим ты можешь не делать новый класс 3д, вот только задание свойств, будет несколько неудобно


 
euru   (2003-11-13 10:42) [33]

>[NIKEL] © (13.11.03 10:08) [31]

procedure repaint(Control: TControl);
begin
Control.repaint();
end;

Получается, здесь я должен начать мучительно сомневаться, потому что не могу быть уверен, repaint() какого класса будет вызываться в это месте.


 
ИдиотЪ   (2003-11-13 10:45) [34]

euru ©
можно вызвать любого, хоть предка, хоть потомка при особом желании, только за последствия ты же и отвечаешь
нарушая определенные правила, или, хотя чего-то абстрактного, нельзя получить что-то определенно конкретное


 
euru   (2003-11-13 10:48) [35]

>ИдиотЪ © (13.11.03 10:45) [34]
Какие правила я нарушаю?


 
Goffman   (2003-11-13 10:55) [36]

2euru

Теория ООП оговаривает три необходимых признака объектной(или если угодно классовой) модели: инкапсуляция, наследование, полиморфизм. Как я понял из ты собираешься отказаться от них всех.
Что же ты предлагаешь взамен? Пока от тебя слышны только выкрики, причем не очень внятные(не в обиду). Приведи хотя бы один пример некорректности текущей теории ООП.


 
[NIKEL]   (2003-11-13 10:59) [37]


procedure repaint(Control: TControl);
begin
Control.repaint();
end;

Получается, здесь я должен начать мучительно сомневаться, потому что не могу быть уверен, repaint() какого класса будет вызываться в это месте


именно!
а если repaint() данного контрола подразумевает (по твоей теории о мутированных 10 объектах из 1000 нормальных) обращение к БД для корректного репаинта содержимого?

repaint() какого класса будет вызываться в это месте
а почему ты говоришь о классах? ты же кричал о "тех некоторых объектах которые должны делать что-то подругому"

ЗЫ не надо надуманных задач


 
euru   (2003-11-13 12:26) [38]

1. Я нигде не говорил о некорректности теории ООП.
2. Как таковой теории в ООП (в математическом смысле) нет. Если бы она была, по крайней мере, один из пунктов в споре между ООБД и реляционными БД можно было убрать.
3. Если все-таки есть теоретическая база ООП, где можно прочесть математически строгое доказательство, что ООП должно выглядеть именно таким образом.

Допустим, инкапсуляция, наследование и полиморфизм - это необходимые признаки. А как же достаточность? Если доказано, что для ООП необходимы эти три признака (кстати, где получить информацию о доказательстве, что необходимы именно эти три признака), но не доказано, что их достаточно, значит, теория неполна, значит, для достаточности могут понадобиться еще какие-то признаки.

Инкапсуляция. Позволяет объединить свойства и поведение класса в единое целое с необходимым уровнем доступа к ним (public, protected, private). Зачем в декларативную часть класса вводить секцию private? Она ведь влияет только на внутренние состояние и поведение класса, и другие классы все равно никак не смогут ими воспользоваться. Не лучше ли было поместить эту секцию в раздел реализации?

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

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

P.S. Я не обижаюсь, но хотелось бы знать, какие именно мои высказывания похожи на выкрики, чтобы в дальнейшем попытаться по-другому их формулировать.


 
Igorek   (2003-11-13 12:29) [39]

2euru
Реализация класса состоит из реализаций методов. Значит если методы "разрывают связь", то и класс "разрывает"...


 
icWasya   (2003-11-13 12:59) [40]

>euru © (12.11.03 17:22) [22]
для таких случаев В Дельфи изобретены Eventы - всякие там OnCreate, OnClick, OnPaint



Страницы: 1 2 вся ветка

Форум: "Потрепаться";
Текущий архив: 2003.12.26;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.56 MB
Время: 0.009 c
1-86366
-=GaLaN=-
2003-12-15 15:19
2003.12.26
Регистрация, ловля и оправка сообщения


3-86291
ploxish
2003-12-01 11:23
2003.12.26
Interbase & Generator


7-86576
незнайка
2003-10-21 16:28
2003.12.26
Запись на DVD+RW средствами WinXP...


3-86242
Слэш
2003-12-04 11:48
2003.12.26
Как составить такой SQL запрос ?


14-86557
hatchy
2003-12-01 10:59
2003.12.26
Ошибка...Windows XP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский