Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 146 147 [148] 149 150 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#2206
,
|
|
|
|
Цитата korvin @ Цитата Each unit should have only limited knowledge about other units: only units "closely" related to the current unit. дык я это и предлагаю, вместо того, чтобы делать конкретные обертки (т.е. классу-контейнеру уже нужно знать, какие методы есть у внутреннего класса), просто разрешить доступ к интерфейсу объекта, но не позволяем внешнему коду работать с этим внутренним объектом "за спиной" у контейнера =) "Класс-контейнер"(с чего, кстати, он контейнер в твоем примере?), реализовывая обертки, избавляет клиента от необходимости знать о классах, которые использует "класс-контейнер". Цитата Цитата D_KEY @ Ты описываешь классы, как контейнеры с кучей полей... Это как-то больше напоминает Сишные структуры, чем классы... блин, я не говорю, что нужно пихать кучу таких полей в классах, но бывает удобно. считай это просто еще одним видом наследования, только не на уровне классов, а на уровне объектов Хм... Я подумаю, но пока преимуществ не вижу. А для такого рода рутины есть шаблоны в IDE и текстовых редакторах, да и кодогенерацию никто не отменял(мне кажется, что подобные "классы-наборы полей" как-раз можно вообще генерировать из каких-то внешних метаданных). |
|
Сообщ.
#2207
,
|
|
|
|
Цитата Qraizer @ Не буду делать много экземпляров, функций, реализаций итп, идея должна быть ясна и так. Я могу переписать с агрегацией, если это больше подходит по дизайну: ![]() ![]() class ISome1 {/* ... */}; class ISome2 {/* ... */}; class Some1 : public ISome1 {/* ... */}; class Some2 : public ISome2 {/* ... */}; void f(ISome1&); class SuperSome { Some1 s1; // "реализация" первого Some2 s2; // "реализация" второго /* ... */ }; int main() { SuperSome object; f(object); // Опа-на, fail. } ![]() ![]() f(object.s1); // Опа-на, win. |
|
Сообщ.
#2208
,
|
|
|
|
Цитата korvin @ ![]() ![]() f(object.s1); // Опа-на, win. Он как-бы private |
|
Сообщ.
#2209
,
|
|
|
|
Цитата Qraizer @ Та скажи ж ты им, наконец, как ты хочешь "два(или больше) объекта A" отличать друг от друга. Синтаксически. Вон, DesweR "догадался" нумеровать. Мне тоже более изящного решения в голову не приходит. в смысле? по имени ![]() ![]() class B { A x; // x -- это имя. A y; // y -- это имя. } B b = new B(); b.x.foo(); // x b.y.foo(); // y что непонятного? |
|
Сообщ.
#2210
,
|
|
|
|
Цитата korvin @ что непонятного? Зачем ?В частности, зачем клиенту B знать о A, если он его никак не использует, кроме как через B? |
|
Сообщ.
#2211
,
|
|
|
|
Цитата D_KEY @ "Класс-контейнер"(с чего, кстати, он контейнер в твоем примере?), реализовывая обертки, избавляет клиента от необходимости знать о классах, которые использует "класс-контейнер". а с чего он не контейнер? по отношению к своим полям он их контейнер. а им и в моем случае не обязательно знать классы внутренних объектов, зачем? только методы. что ![]() ![]() C.x.foo(); C.x.bar(); C.y.foo(); C.y.bar(); что ![]() ![]() C.x_foo(); C.x_bar(); C.y_foo(); C.y_bar(); в данном случае монопенисуально, только в моем случае не нужно самостоятельно писать эти обертки Добавлено Цитата D_KEY @ В частности, зачем клиенту B знать о A, если он его никак не использует, кроме как через B? а ему и не надо знать, с чего ты взял, что надо? Добавлено Цитата D_KEY @ Цитата korvin @ ![]() ![]() f(object.s1); // Опа-на, win. Он как-бы private ![]() он как бы read-only свойство (в нормальных языках =) ) или пишите обертки =))) |
|
Сообщ.
#2212
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ "Класс-контейнер"(с чего, кстати, он контейнер в твоем примере?), реализовывая обертки, избавляет клиента от необходимости знать о классах, которые использует "класс-контейнер". а с чего он не контейнер? по отношению к своим полям он их контейнер. Нет. В этом случае, это просто структура, кортеж с именованными полями, если угодно. Поля же объекта - это атрибуты объекта. Цитата Если ты их так назовешь и будешь к ним так относится, то да.что ![]() ![]() C.x.foo(); C.x.bar(); C.y.foo(); C.y.bar(); что ![]() ![]() C.x_foo(); C.x_bar(); C.y_foo(); C.y_bar(); в данном случае монопенисуально, только в моем случае не нужно самостоятельно писать эти обертки Но не забывай, что те классы(и их интерфейс), которые рассматриваемый класс использует, могут и изменится. И это не должно затрагивать клиентов, если контракт, фактически, не изменился. Цитата Как он узнает, какие методы он может вызывать? Цитата D_KEY @ В частности, зачем клиенту B знать о A, если он его никак не использует, кроме как через B? а ему и не надо знать, с чего ты взял, что надо? Добавлено Цитата korvin @ read-only свойство (в нормальных языках =) ) Синтаксический сахар, не более |
|
Сообщ.
#2213
,
|
|
|
|
Цитата D_KEY @ Нет. В этом случае, это просто структура, кортеж с именованными полями, если угодно. Поля же объекта - это атрибуты объекта. а, прости, ты слово "контейнер" понимаешь только как какой-то абстрактный шаблонный класс AContainer<T>? представляющий некую коллекцию объектов? Добавлено Цитата D_KEY @ Как он узнает, какие методы он может вызывать? так же как и всегда -- из интерфейса (неявного в данном случае) Добавлено Цитата D_KEY @ Нет. В этом случае, это просто структура, кортеж с именованными полями, если угодно. Поля же объекта - это атрибуты объекта. да ну? кто сказал, что у контейнерного класса при этом нет каких-то своих приватных полей и публичных методов? |
|
Сообщ.
#2214
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Нет. В этом случае, это просто структура, кортеж с именованными полями, если угодно. Поля же объекта - это атрибуты объекта. а, прости, ты слово "контейнер" понимаешь только как какой-то абстрактный шаблонный класс AContainer<T>? представляющий некую коллекцию объектов? http://en.wikipedia.org/wiki/Container_(data_structure) Цитата Цитата D_KEY @ Как он узнает, какие методы он может вызывать? так же как и всегда -- из интерфейса (неявного в данном случае) Как это неявного? Как можно что-то узнать от неявного интерфейса? Что это вообще означает? Цитата Цитата D_KEY @ Нет. В этом случае, это просто структура, кортеж с именованными полями, если угодно. Поля же объекта - это атрибуты объекта. да ну? кто сказал, что у контейнерного класса при этом нет каких-то своих приватных полей и публичных методов? Могут быть. Только как это связано с тем, что говорил я? |
|
Сообщ.
#2215
,
|
|
|
|
Цитата D_KEY @ Если ты их так назовешь и будешь к ним так относится, то да. Но не забывай, что те классы(и их интерфейс), которые рассматриваемый класс использует, могут и изменится. И это не должно затрагивать клиентов, если контракт, фактически, не изменился. изменение интерфейса в любом случае кого-то затронет. но я же и не призываю бездумно использовать чужие классы. если тебе нужен класс с устойчивым интерфейсом, то таким его и делай, если нужно, чтобы интерфейсы этих полей менялись с изменениями их классов -- то почему бы и нет? опять же, если и внутренние и внешние классы -- твои, то почему бы не иметь такую возможность? да может не суперполезна, но мне иногда хотелось, чтоб была. |
|
Сообщ.
#2216
,
|
|
|
|
korvin, ты можешь сформулировать свою идеи и нормально оформить, желательно с примерами на каком-то языке(реальном или гипотетическом, главное - полный пример синтаксиса с описанием семантики)?
|
|
Сообщ.
#2217
,
|
|
|
|
ну и чем это определение противоречит классу Point { int x, y, z } как множеству трех целых чисел? |
|
Сообщ.
#2218
,
|
|
|
|
Цитата korvin @ то почему бы и нет? Потому, что это нарушает такое простое понятие, как инкапсуляция. Но тебе никто не мешает(если это действительно необходимо) сделать методы get и set, работающие именно с объектами данных классов. Ты же хочешь чего-то среднего... Добавлено Цитата korvin @ ну и чем это определение противоречит классу Point { int x, y, z } как множеству трех целых чисел? Ничем. Только это не класс. Это структура. Интерфейсом, фактически, тут являются сами данные. |
|
Сообщ.
#2219
,
|
|
|
|
Цитата D_KEY @ Как это неявного? Как можно что-то узнать от неявного интерфейса? Что это вообще означает? это значит не объявленного явно. класс ![]() ![]() class A { private int x; public int getX() { return x; } } неявно реализует интерфейс ![]() ![]() interface { int getX(); } Добавлено Цитата D_KEY @ Могут быть. Только как это связано с тем, что говорил я? так, что это не кортеж |
|
Сообщ.
#2220
,
|
|
|
|
Цитата korvin @ Цитата D_KEY @ Как это неявного? Как можно что-то узнать от неявного интерфейса? Что это вообще означает? это значит не объявленного явно. класс ![]() ![]() class A { private int x; public int getX() { return x; } } неявно реализует интерфейс ![]() ![]() interface { int getX(); } Цитата - Ты знал, что Тоха - амбидекстер? - Кто? - Тоха. Это все понятно... Ты мне скажи, как клиент узнает интерфейс того поля, к которому будет обращаться, если не будет знать его класса? |