Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.156] |
|
|
Правила раздела:
| Страницы: (495) « Первая ... 206 207 [208] 209 210 ... 494 495 ( Перейти к последнему сообщению ) |
Delphi vs C++ vs C#
, ну и Java немножко, где-то ближе к старшему байту номеров страниц
|
Сообщ.
#3106
,
|
|
|
|
Цитата Romkin @ Что значит "как Car"? Не согласен. Например, у Car есть абстрактный метод "переключить скорость". В BMV он реализован. В каком это случае мне нужно, чтобы BMW вел себя как Car?! BMW в любом случае будет вести себя как Car, иначе просто не получится из нее машины... Вот ситуация, стоишь ты на дороге, ровной, без горок, вдали - едет машина, ты видишь как она едет, и т.д., но марки этой машины ты не знаешь, вот когда она к тебе уже подъехала, вот тогда ты только увидел что это BWM, потому что у нее характеристики(по которым ты определил что это именно BMW) - от BMW. Допустим специфический шум двигателя, колеса, кузов, опозновательные значки и т.д. |
|
Сообщ.
#3107
,
|
|
|
|
Цитата Romkin @ Интересно, а как это метод класса может иметь доступ к полям экземпляра? В Delphi это запрещено. А зачем ему иметь доступ к полям? Если конструктор - метод класса, то он управляет созданием объекта и выполняет инициализацию полей(создание), это не совсем тоже самое, что доступ к полям уже существующего экземпляра. Хотя на мой взгляд методы класса должны иметь право доступа к полям экземпляра(если в их распоряжении каким-то образом оказался этот экземпляр). Не вижу причин для запрета. |
|
Сообщ.
#3108
,
|
|
|
|
Вот нифига. Car переключать скорости не может. При такой попытке ты получишь отлуп. Поэтому я и говорю, что BMW отличается от Car, на нем-то ты скорость переключишь! А то, что ты едешь на нем как на обычном "Car" - так так и должно быть. Цитата D_KEY @ Если конструктор - метод класса, то он управляет созданием объекта и выполняет инициализацию полей(создание), это не совсем тоже самое, что доступ к полям уже существующего экземпляра. Хотя на мой взгляд методы класса должны иметь право доступа к полям экземпляра(если в их распоряжении каким-то образом оказался этот экземпляр). Не вижу причин для запрета Бррр. А "инициализация" разве не подразумевает "доступ к полям", прямо или опосредованно? Что ты тогда инициализируешь-то? Ну и бардак же у вас... В Delphi у метода класса есть доступ только к классу, к его полям и методам. Не забывай, что в Delphi есть три вида методов, статический метод класса (это ваш вариант метода класса), метод класса и метод объекта. У метода класса self указывает на метакласс, а у объекта - на экземпляр. |
|
Сообщ.
#3109
,
|
|
|
|
Цитата Romkin @ Где написано, что конструктор вызывается автоматически? Даже в С++ ты иногда указываешь, какой конструктор вызвать. А где тогда автоматизация? При создании экземпляра класса, я считаю конструктор должен вызываться автоматически, иначе зачем его тогда писать? Я могу и так, повызывать SetValue1, SetValue2, и проинициализировать нужные мне члены класса, на кой мне тогда конструктор вообще нужен? Это когда я описываю конструктор производного класса, при множественном наследовании, в остальных случаях, не нужно указывать, ибо компилятор и сам знает что его нужно вызвать. |
|
Сообщ.
#3110
,
|
|
|
|
Цитата Romkin @ Вот нифига. Car переключать скорости не может. Как это? С точки зрения клиента Car именно это и делает. А для чего же еще в контракте описан метод ?Цитата При такой попытке ты получишь отлуп. Нет, не получу. Отлуп я получу, если вдруг попытаюсь создать объект класса Car, т.к. совершенно непонятно(в той модели, которую мы рассматриваем), как можно создать просто "машину". Цитата Поэтому я и говорю, что BMW отличается от Car, на нем-то ты скорость переключишь! Ну как же не могу, если у него есть метод? То, что метод абстрактный - проблема наследников и тех, кто отвечает за создание машин. Не клиента. Цитата Цитата D_KEY @ Если конструктор - метод класса, то он управляет созданием объекта и выполняет инициализацию полей(создание), это не совсем тоже самое, что доступ к полям уже существующего экземпляра. Хотя на мой взгляд методы класса должны иметь право доступа к полям экземпляра(если в их распоряжении каким-то образом оказался этот экземпляр). Не вижу причин для запрета Бррр. А "инициализация" разве не подразумевает "доступ к полям", прямо или опосредованно? Что ты тогда инициализируешь-то? Полей нет до тех пор, пока ты их не проинициализировал. Что тут непонятного? Ты формируешь объект, его нет еще. Подумай, скажем о неизменяемых объектах. Задание полей в конструкторе - нормально, а вот изменения их после создания - уже противоречие. Это разные этапы. Цитата Я понимаю. В питоне, например, классы тоже объекты. Речь не о том.Не забывай, что в Delphi есть три вида методов, статический метод класса (это ваш вариант метода класса), метод класса и метод объекта. У метода класса self указывает на метакласс, а у объекта - на экземпляр. Строго говоря, у вас нет конструктора - у вас инициализатор уже созданного объекта. Отсюда и непонимание. Добавлено Опять конструкторы обсуждаем |
|
Сообщ.
#3111
,
|
|
|
|
Цитата Romkin @ Почему? В нем реализована некая усредненная или конкретная наиболее распространенная коробка передач. Почему он должен быть обязательно абстрактным? Car переключать скорости не может. Добавлено а inherited Create - это что? |
|
Сообщ.
#3112
,
|
|
|
|
? ![]() ![]() A* a;// = new A; a->Foo(); a->Bar(); Цитата KILLER @ А вот юзнуть в конструкторе член базового класса, который еще не инициализирован вполне реально, и даже более того, это очень сильно реально ?? ![]() ![]() constructor TDerived.Create; begin inherited Create; Foo; Bar; end; Цитата D_KEY @ Везде ссылочная семантика. Проблему производительности работы с примитивными типами решается за счет объявления их иммутабельными и запрета наследования от них. В этом случае оптимизатор сможет заменить ссылки на такие объекты на непосредственные значения, поскольку это не повлияет на видимое поведение. И в чём тогда изюминка, если нет разницы? Вот только не надо ляля А ещё в Delphi есть виртуальные статические методы |
|
Сообщ.
#3113
,
|
|
|
|
Цитата DesweR @ ? И где там экземпляр класса? Цитата DesweR @ ?? В конструкторе производного класса, обратится к полям базового, Create мне нужно ручками писать, оно автоматом ведь не вызовеца.\ |
|
Сообщ.
#3114
,
|
|
|
|
Цитата KILLER @ А где тогда автоматизация? При создании экземпляра класса, я считаю конструктор должен вызываться автоматически, иначе зачем его тогда писать? Я могу и так, повызывать SetValue1, SetValue2, и проинициализировать нужные мне члены класса, на кой мне тогда конструктор вообще нужен? Автоматизация покруче в Delphi будет. Я ж сказал: объект создается сразу, причем кодом, уже написанным опытными людьми, единообразно для любого объекта. На основе данных метакласса, которые собирает автоматически компилятор. Все, что остается программисту - проинициализировать поля. Все. Он не собирается по кусочкам из предков, нафига? Цитата D_KEY @ Строго говоря, у вас нет конструктора - у вас инициализатор уже созданного объекта. Отсюда и непонимание. Добавлено Сегодня, 13:28 Опять конструкторы обсуждаем Да, если ты помнишь, я согласился с такой формулировкой. Код собственно конструктора в вашем понимании я привел выше, _ClassCreate. Но опять же он вызывается однократно для создания экземпляра, нет цепочки по предкам. Вообще обсуждение конструкторов неконструктивно в дальнейшем: я уже для себя уяснил, что сишники подразумевают под конструктором, и мне это не нравится. Думаю, что объяснить, что такое конструирование в Delphi я тоже смог. Цитата trainer @ Цитата (Romkin @ Сегодня, 13:15) Car переключать скорости не может. Почему? В нем реализована некая усредненная или конкретная наиболее распространенная коробка передач. Почему он должен быть обязательно абстрактным? По постановке. У экземпляра Car переключение - абстрактный метод, поэтому переключить скорости у абстрактной машины ты не можешь. BMW - конкретная машина, если ты общаешься с ней как с Car это не должно отменять поведения, модифицированного у BMW. Почему абстрактный: какая коробка у электромобиля? Или ты хочешь вообще отменить абстрактные методы и иметь всегда действие по умолчанию? Если я в метод, который переключает скорости у Сar подал BMW, то я и хочу, чтобы переключилась скорость у BMW, а не какого-то там абстрактного автомобиля. А если я подал в этот метод электромобил - то это явная исключительная ситуация... Добавлено Цитата DesweR @ А ещё в Delphi есть виртуальные статические методы Не путай бедных сишников. Виртуальные методы класса и статические методы - это разные вещи. В Delphi есть оба варианта, а в С++ - только второй. |
|
Сообщ.
#3115
,
|
|
|
|
Цитата Romkin @ Автоматизация покруче в Delphi будет. Я ж сказал: объект создается сразу, причем кодом, уже написанным опытными людьми, единообразно для любого объекта. На основе данных метакласса, которые собирает автоматически компилятор. Все, что остается программисту - проинициализировать поля. Все. Он не собирается по кусочкам из предков, нафига? Конечно автоматизация покруче будет, создать монолит, то оно создает, а вот если во время той же инициализации вылетело исключение, то все - кирдык, уже в монолите оно никак не может откатить совершенные действия - и делаете вы эти действия ручками. В С++, напротив, зачем делать монолитный объект? Проще разбить его на стадии, так удобнее отслеживать где произошла ошибка, и в случае чего автоматически откатить совершенные действия... А автоматизация в Делфи да, аж по круче всех будет... |
|
Сообщ.
#3116
,
|
|
|
|
Цитата Romkin @ Какая есть, такая и стоит. А в чем проблема? Почему абстрактный: какая коробка у электромобиля? |
|
Сообщ.
#3117
,
|
|
|
|
Цитата DesweR @ ? ![]() ![]() A* a;// = new A; a->Foo(); a->Bar(); Тут нет экземпляра. Цитата А если в конструкторе базового есть вызов полиморфного метода? Не сможет ли он испортить еще несформированный объект?Цитата KILLER @ А вот юзнуть в конструкторе член базового класса, который еще не инициализирован вполне реально, и даже более того, это очень сильно реально ?? ![]() ![]() constructor TDerived.Create; begin inherited Create; Foo; Bar; end; Цитата Разницы с чем?Цитата D_KEY @ Везде ссылочная семантика. Проблему производительности работы с примитивными типами решается за счет объявления их иммутабельными и запрета наследования от них. В этом случае оптимизатор сможет заменить ссылки на такие объекты на непосредственные значения, поскольку это не повлияет на видимое поведение. И в чём тогда изюминка, если нет разницы? "Изюминка" в том, что в языке не будет неоднозначности, обобщенный код страдать не будет, и не нужно будет ковыряться в коде и выяснять является ли данный тип классом или нет. Цитата Ну как знаешь, только я TAPL до участия в теме читал. Думаю, что korvin тоже.Вот только не надо ляля Быть может и ты его читал и мы советовали это делать друг другу. Цитата А ещё в Delphi есть виртуальные статические методы ![]() Нечто не может являтся "виртуальным" и "статическим" одновременно. Ты имел в виду методы класса? Это да, хорошо |
|
Сообщ.
#3118
,
|
|
|
|
Цитата Romkin @ Но опять же он вызывается однократно для создания экземпляра, нет цепочки по предкам. Что-то я недогоняю. Вот есть у нас всё то же отношение TAbstractButton <- TCustomButton <- TButton. Предположим, что у TAbstractButton есть поле State, которое при инициализации должно быть установлено в значение Normal (которое имеет числовое значение '10'). Правильно ли я понимаю (из твоего утверждения), что это поле должно устанавливаться соответствующим образом и в "конструкторе" класса TCustomButton и в конструкторе класса TButton? |
|
Сообщ.
#3119
,
|
|
|
|
Цитата Romkin @ По постановке. У экземпляра Car переключение - абстрактный метод, поэтому переключить скорости у абстрактной машины ты не можешь. BMW - конкретная машина, если ты общаешься с ней как с Car это не должно отменять поведения, модифицированного у BMW. Почему абстрактный: какая коробка у электромобиля? Или ты хочешь вообще отменить абстрактные методы и иметь всегда действие по умолчанию? Если я в метод, который переключает скорости у Сar подал BMW, то я и хочу, чтобы переключилась скорость у BMW, а не какого-то там абстрактного автомобиля. А если я подал в этот метод электромобил - то это явная исключительная ситуация... В постановке задачи, коробка передач не фигурировала, это ты ее придумал переключать у Бэхи.. А управляешь ты этой BMW через класс Car, иначе на кой нам вообще этот Car нужен ? Электромобиль - это как раз таки тот класс, который будет наследоватся от Car, и изменять поведение переключения передач, если у машины это будет просто дернуть рычаг и повысить скорость, то у электромобиля - это будет например что то другое... |
|
Сообщ.
#3120
,
|
|
|
|
Цитата trainer @ Какая есть, такая и стоит. ![]() ![]() class GearBox { public: virtual void SwitchGear() = 0; }; class ManualGearBox { public: virtual void SwitchGerar(); }; class AutomaticGearBox { public: virtual void SwitchGerar(); }; class Car { public: Car(GearBox* box = NULL) : m_GearBox(box ? box : new ManualGearBox()) {;} void SwitchGear() {m_GearBox->SwitchGear();} private: GearBox* m_GearBox; }; class BMWCar : public Car { public: BMWCar() : Car(new AutomaticGearBox()) {;} }; Нда... Как-то вот так. Какая есть - такая и стоит. |