Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.192] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 34 35 [36] 37 38 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#526
,
|
|
|
|
Так, еще раз. Когда ты пишешь get, то в интерфейсе класса автоматически появляется метод get_MyProp, из которого ты дернешь еще один метод. У тебя - два метода! Хотя реально нужен только один. Сравним на примере? Я даю условие, а отом ты приводишь решение на C#, я - на Delphi и мы сравним Инкапсуляция ему не позволяет. Он не задается вопросом, Points - это что, поле-массив или свойство с геттером/сеттером? И он в любом случае напишет Points[0] := 10;, что бы там ни было, а не SetPoint(0, 10). Иначе свойства вообще как таковые не нужны, если явно вызывать методы. Цитата korvin @ я вообще не очень понимаю, зачем нужны свойства, есть публичные методы -- интерфейс объекта, свойства-то зачем? В принципе такую позицию можно принять с некоторым допущение, но тогда бы в C# бы ее и приняли - зачем делать кастрированные свойства? Не делали бы вообще, пострадала бы инкапсуляция правда в этом случае. Свойства - это хорошая штука, инкапсуляция в полном ее проявлении, ты работаешь с сущностью как с полем (такое представление о члене класса во многих случаях гораздо удобнее), притом что 1. Реальное поле тебе не доступно и доступ к нему строго контролируем. 2. Реального поля может и не быть вовсе 3. При чтении/записи можно выполнять дополнительные действия (инициировать события, рассчитывать значение только при запросе и т.д.) 4. Он не знает что там на самом деле - поле или метод, притом что код его одинаков. И если внутреннее представление поменяется - на клиентском коде это не отобразится Добавлено Да ты сахара этого даже и не пробовал никогда, как ты можешь судить? В С++ ООП на зародышевом уровне, печально что C#, который позиционируется как 100%-объектный, в некоторых вопросах недалеко ушел. Кури инкапсуляцию |
|
Сообщ.
#527
,
|
|
|
|
Цитата --Ins-- @ Так, еще раз. Когда ты пишешь get, то в интерфейсе класса автоматически появляется метод get_MyProp, из которого ты дернешь еще один метод. У тебя - два метода! Хотя реально нужен только один. В IL коде что ли? Вах, беда то какая! Чему это мешает то? На использовании класса это никак не скажется. При том, что реальные геттер/сеттеры будут private или protected, и потому не будут видны. Цитата --Ins-- @ Сравним на примере? Я даю условие Для начала такой вопрос: можно ли в дельфи сделать геттер public, а сеттер - protected? Цитата --Ins-- @ а отом ты приводишь решение на C#, я - на Delphi и мы сравним Кто "мы"? Как будет происходить сравнение? По каким параметрам? Цитата --Ins-- @ Инкапсуляция ему не позволяет. Он не задается вопросом, Points - это что, поле-массив или свойство с геттером/сеттером? И он в любом случае напишет Points[0] := 10;, что бы там ни было, а не SetPoint(0, 10). Иначе свойства вообще как таковые не нужны, если явно вызывать методы. Глухой write only? В третий раз Цитата MyNameIsIgor @ И я ещё раз спрашиваю: как синтаксически вызываются индексаторы, у которых разные имена, но одинаковые параметры? Добавлено Цитата --Ins-- @ Да ты сахара этого даже и не пробовал никогда, как ты можешь судить? В С++ ООП на зародышевом уровне, печально что C#, который позиционируется как 100%-объектный, в некоторых вопросах недалеко ушел. Кури инкапсуляцию Уууу... И тут Остапа понесло |
|
Сообщ.
#528
,
|
|
|
|
Цитата MyNameIsIgor @ Чему это мешает то? Это оверхид А потому - костыль. Мы же обходимся сразу вызовом виртуального метода для доступа к свойству, без посредника, и это в языке-то, который не на 100% объектно-ориентирован Цитата MyNameIsIgor @ Для начала такой вопрос: можно ли в дельфи сделать геттер public, а сеттер - protected? Можно, а в C#? Цитата MyNameIsIgor @ Кто "мы"? Ты да я да мы с тобой Цитата MyNameIsIgor @ В третий раз Я же в процитированном тобой сообщении написал: MyObj.Poinst[0] := MyObj.Rects[0] := Кстати, пометив свойство директивой default добиваемся того же, что и в шарпе, а именно MyObj[0] := Добавлено Цитата MyNameIsIgor @ Уууу... И тут Остапа понесло Я рад, что тебе на это нечего ответить по существу |
|
Сообщ.
#529
,
|
|
|
|
Цитата --Ins-- @ Это оверхид Ой, держите меня семеро Это говорит тот, кто для хэширования предлагал сериализовать экземпляр, ахахахахаха ![]() Цитата --Ins-- @ Можно, а в C#? Даю три попытки отгадать. Цитата --Ins-- @ Ты да я да мы с тобой Ну, вот и сразу могу сказать, что я то уж точно напишу лучше, ибо вы наверняка свойства сериализуете, прежде чем изменить ![]() Цитата --Ins-- @ Я рад, что тебе на это нечего ответить по существу Я простой крестьянский парень и на сомнения в моём профессионализме отвечаю лицом к лицу |
|
Сообщ.
#530
,
|
|
|
|
Цитата MyNameIsIgor @ Это говорит тот, кто для хэширования предлагал сериализовать экземпляр Тьфу, вспомнил, блин. Уже не предлагаю, успокойся Цитата MyNameIsIgor @ Ну, вот и сразу могу сказать, что я то уж точно напишу лучше, ибо вы наверняка свойства сериализуете, прежде чем изменить Чяво???? Давай, пиши, пример почти из моего примера, прошу прощения за тафталогию Чисто для демонстрации свойствЕсть класс, который просто хранит две координаты - TRect. Нужно у этого класса завести много разных свойств, которые дадут доступ к этим координатам любым удобным способом, а именно: - свойства Left, Top, Right, Bottom - свойства LeftTop, RightBottom - свойство Points[Index: Integer]: Point, где Index - 0 для LeftTop и 1 для RightBottom - свойство Coords[Index: Integer]: Integer, где Index = 0..3 для Left, Top, Right, Bottom соответственно. Решение на Delphi: ![]() ![]() type TPoint = record X, Y: Integer; end; TRectCoords = record case Integer of 0: (Points: array[0..1] of TPoint); 1: (Coords: array[0..3] of Integer); end; TRect = class private FCoords: TRectCoords; function GetCoord(Index: Integer): Integer; procedure SetCoord(Index: Integer; Value: Integer); function GetPoint(Index: Integer): TPoint; procedure SetPoint(Index: Integer; Value: TPoint); public property Left: Integer read GetCoord write SetCoord index 0; property Top: Integer read GetCoord write SetCoord index 1; property Right: Integer read GetCoord write SetCoord index 2; property Bottom: Integer read GetCoord write SetCoord index 3; property LeftTop: TPoint read GetPoint write SetPoint index 0; property RightBottom: TPoint read GetPoint write SetPoint index 1; property Coords[Index: Integer]: Integer read GetCoord write SetCoord; property Points[Index: Integer]: TPoint read GetPoint write SetPoint; end; function TRect.GetCoord(Index: Integer): Integer; begin Result := FCoords.Coords[Index]; end; procedure TRect.SetCoord(Index: Integer; Value: Integer); begin FCoords.Coords[Index] := Value; end; function TRect.GetPoint(Index: Integer): TPoint; begin Result := FCoords.Points[Index]; end; procedure TRect.SetPoint(Index: Integer; Value: TPoint); begin FCoords.Points[Index] := Value; end; Давай аналог на C# |
|
Сообщ.
#531
,
|
|
|
|
Цитата --Ins-- @ Давай аналог на C# Надо было добавить ещё "я сказал" для пущего эффекта. А write only надо лечить Цитата MyNameIsIgor @ Как будет происходить сравнение? По каким параметрам? |
|
Сообщ.
#532
,
|
|
|
|
MyNameIsIgor, да ты сначала реши эту архисложную задачу, требующую нетривиальных идей и реализаций, а там разберемся по каким параметрам сравнивать
Я код прямо сюда писал в силу его архисложности. А там - ты покритикуешь мою, а я - твою. Или спрыгиваешь? |
|
Сообщ.
#533
,
|
|
|
|
Цитата --Ins-- @ MyNameIsIgor, да ты сначала реши эту архисложную задачу Зачем? Потому что вы изволили меня об этом попросить? Так плохо вы просите, волшебное слово забыли. И на колени встать Цитата --Ins-- @ там разберемся по каким параметрам сравнивать Да знаю я эти "параметры"... Наслушался уже Остапа. Цитата --Ins-- @ Или спрыгиваешь? А я и не запрыгивал |
|
Сообщ.
#534
,
|
|
|
|
зачем мне работать с полем? Есть объект, ему посылаются сообщения. Причем тут свойства?
|
|
Сообщ.
#535
,
|
|
|
|
Цитата MyNameIsIgor @ Зачем? Потому что вы изволили меня об этом попросить? Затем, чтобы ты понял что такое "нормальные свойства", о которых ты было САМ спросил Ну я думаю ты понял А вот и волшебные слова: cлив засчитан |
|
Сообщ.
#536
,
|
|
|
|
Цитата --Ins-- @ А вот и волшебные слова: cлив засчитан Закрываю над вами крышку унитаза |
|
Сообщ.
#537
,
|
|
|
|
Язычок у тебя острый, я погляжу... А вот по части своего профессионализьма, который ты отстаиваешь лицом
- не убедил. |
|
Сообщ.
#538
,
|
|
|
|
Цитата --Ins-- @ В С++ ООП на зародышевом уровне Ты всю соседнюю тему пытаешься это доказать, но у тебя так и не вышло. Свойства не имеют никакого отношения к ООП. Если не согласен, то пожалуйста предоставь ссылку на источник информации, с удовольствием обнаружу свои заблуждения Вообще состояние объекта - его личное дело и очень редко нужно рассматривать объект исключительно как набор изменяемых атрибутов. Добавлено Цитата --Ins-- @ Нужно у этого класса завести много разных свойств, которые дадут доступ к этим координатам любым удобным способом, а именно: - свойства Left, Top, Right, Bottom - свойства LeftTop, RightBottom - свойство Points[Index: Integer]: Point, где Index - 0 для LeftTop и 1 для RightBottom - свойство Coords[Index: Integer]: Integer, где Index = 0..3 для Left, Top, Right, Bottom соответственно. ОМГ. Зачем? Добавлено Цитата korvin @ зачем мне работать с полем? Есть объект, ему посылаются сообщения. Причем тут свойства? +1 |
|
Сообщ.
#539
,
|
|
|
|
--Ins--, вы так жаждали, так жаждали
![]() ![]() ![]() class Indexer<TIndex, TValue> { private Func<TIndex, TValue> getter; private Action<TIndex, TValue> setter; public Indexer(Func<TIndex, TValue> getter, Action<TIndex, TValue> setter) { this.getter = getter; this.setter = setter; } public TValue this[TIndex i] { get { return getter(i); } set { setter(i, value); } } } struct Point { public int X, Y; } class Rectangle { private int[] coords = new int[4]; private int GetCoord(int i) { return coords[i]; } private void SetCoord(int i, int value) { coords[i] = value; } private Point GetPoint(int i) { return new Point() { X = coords[i * 2], Y = coords[i * 2 + 1] }; } private void SetPoint(int i, Point value) { coords[i * 2] = value.X; coords[i * 2 + 1] = value.Y; } public int Left { get { return GetCoord(0); } set { SetCoord(0, value); } } public int Top { get { return GetCoord(1); } set { SetCoord(1, value); } } public int Right { get { return GetCoord(2); } set { SetCoord(2, value); } } public int Bottom { get { return GetCoord(3); } set { SetCoord(3, value); } } public Point LeftTop { get { return GetPoint(0); } set { SetPoint(0, value); } } public Point RightBottom { get { return GetPoint(1); } set { SetPoint(1, value); } } public Indexer<int, int> Coords { get { return new Indexer<int, int>(i => GetCoord(i), (i, v) => SetCoord(i, v)); } } public Indexer<int, Point> Points { get { return new Indexer<int, Point>(i => GetPoint(i), (i, v) => SetPoint(i, v)); } } } Кстати, вот так ![]() ![]() MyObj.Points[0].X := 0; работает? Вот это что? ![]() ![]() TRectCoords = record case Integer of 0: (Points: array[0..1] of TPoint); 1: (Coords: array[0..3] of Integer); end; Недоunion? ![]() Цитата --Ins-- @ Язычок у тебя острый, я погляжу... Не надо на него смотреть, я стесняюсь ![]() Цитата --Ins-- @ не убедил Поверьте, я вас ни в чём не убеждал... P.S. Теперь для оправдания названия темы хоть ещё и на плюсах пиши... Хех, а я хотел поужинать |
|
Сообщ.
#540
,
|
|
|
|
MyNameIsIgor, немного не в тему вопрос, можно ли как-то заставить лямбду захватывать объект по мягкой ссылке?
|