Вниз
Скачать: CL | DM;

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

← →
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 вся ветка

Скачать: CL | DM;



Память: 0.56 MB
Время: 0.012 c
3-86273
чайник
2003-12-03 11:26
2003.12.26
передача из базы в Excel


4-86601
Sergey Koshelev
2003-10-30 16:55
2003.12.26
Таймер не запускается чаще, чем через 55 msec


1-86332
Alexest
2003-12-15 15:28
2003.12.26
помогите с ActiveX Control


4-86585
RustiK
2003-10-28 14:14
2003.12.26
Hotkey во всех прогах


1-86353
bober
2003-12-12 14:01
2003.12.26
создание функций в run_time




   Наверх