![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
sheka |
![]()
Сообщение
#1
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Какое отличие Class от Object ?
Вот здесь делаю одномерный массив объектом: Модуль (Показать/Скрыть)
Программа (Показать/Скрыть)
Сообщение отредактировано: sheka - 28.03.2010 15:07 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Класс обязан инициализироваться конструктором всегда. Для Object это не так (если нет виртуальных методов - конструктор можно не вызывать). Так что добавь
Column := TColumn.Create;и наслаждайся ![]() |
Unconnected |
![]()
Сообщение
#3
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Сначала ж надо вызвать конструктор объекта:)
Класс - это такой тип данных. А объект - экземпляр класса. Добавлено через 1 мин. Чуть опоздал) -------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
sheka |
![]()
Сообщение
#4
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Я уже Это пробовал после прочитки этой статьи http://e-dok.narod.ru/delphi/question1/opas/opas-004.html (других не нашел), не помогает.
|
Unconnected |
![]()
Сообщение
#5
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Так у тебя массив типа TYac, который является классом, следовательно, нужно вызывать конструктор для каждого элемента массива...
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Угу... Вот для этого и придумали конструкторы. Чтобы в момент конструирования TColumn тебе не пришлось заботиться о создании каждого элемента Col - сделай так:
Constructor TColumn.Create; Кстати, я бы заменил функции на property, чтоб было совсем хорошо ![]() TYac = {object}class Не проще? Можно и еще дальше пойти, и GetZnaс/PutZnaс в классе TColumn тоже на свойство поменять. |
sheka |
![]()
Сообщение
#7
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Точно!
Спасибо. Добавлено через 4 мин. Я сделал именно так))) constructor TColumn.Create; Только вместо Inherited Create; написал просто Inherited; . Какая между этими вариантами разница? Сообщение отредактировано: sheka - 28.03.2010 15:57 |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Никакой разницы в данном случае не будет. Я обычно добавляю имя конструктора, хотя этого можно и не делать.
Цитата Без параметров Inherited вызывает так же названный метод родительского класса, с теми же самыми параметрами. |
sheka |
![]()
Сообщение
#9
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Пробую сделать свойствами:
type Программа зависает. И когда function GetValue:integer; ставлю в private, то вне модуля их не видно, а свойство Value видно. |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Цитата Программа зависает. Показывай, как вызываешь...Цитата ставлю в private, то вне модуля их не видно, а свойство Value видно. Ну, это там и должно быть. Private - он на то и приватный, чтобы не быть видимым извне. Только изнутри. А Value у тебя published, поэтому и видимое отовсюду. |
volvo |
![]()
Сообщение
#11
|
Гость ![]() |
Ух ты... Сразу не заметил... Ты чего ж делаешь?
function TCell.GetValue:integer; Ты же с помощью Геттера/Сеттера должен обращаться к полю, а не к свойству. А свойство работает через Геттер/Сеттер, а не напрямую с полем. Понимаешь, в чем преимущество? Вот ты сам написал, что методы GetValue/PutValue невидимы, так? И поле fValue тоже невидимо. Но в то же время свойство-то видимо, и обращаешься ты через него к невидимому полю посредством невидимой же функции. |
Client |
![]()
Сообщение
#12
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
Про то что можно описывать Object я даже и не знал... везде видел только class
![]() а про то что свойство можно вызывать рекурсивно - вообще не знал ![]() Добавлено через 2 мин. Цитата А свойство работает через Геттер/Сеттер, а не напрямую с полем Это ведь в данном случае, так как свойство описано с помощью процедуры и функции ?Сообщение отредактировано: Client - 28.03.2010 20:42 |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Цитата Про то что можно описывать Object я даже и не знал... Вообще-то использование Object-ов в Дельфи не рекомендуется. Это устаревший тип, который не изменяется еще с Дельфи 4, если не ошибаюсь. Рекомендуется использовать либо Class, либо расширенные записи (начиная с D2006 записи могут иметь конструкторы, методы, и умеют перегружать операции). Object оставлен для совместимости (ох уж эта совместимость...) |
sheka |
![]()
Сообщение
#14
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Модуль (Показать/Скрыть)
Программа (Показать/Скрыть)
Не работают закомментированые строчки. Насколько я понял, это происходит из-за того, что "Published свойства не могут возвращать массивы." , а Publiс не видны "родственникам по программе" дальше чем потомки данного класса. Добавлено через 8 мин. Извините, забыл. Задание: Найти произведение матриц. Сообщение отредактировано: sheka - 28.03.2010 22:48 |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
А может причина-таки в другом? Я ж говорил тебе, что каждый экземпляр класса должен быть создан. Вот и создавай:
function TFunc.Mult(a,b:TMatr;N:byte):TMatr; |
sheka |
![]()
Сообщение
#16
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Да..
![]() ![]() |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
sheka
Ты думаешь это все, чего можно добиться Свойствами? Ошибаешься. Опиши оба свойства (и Column в классе TColumn, и Row в классе TRow) как Default, и тогда обращение к содержимому матрицы упростится: function TFunc.Mult(a,b:TMatr;N:byte):TMatr; |
sheka |
![]()
Сообщение
#18
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
property Column[j:integer]:TCell read GetCell write SetCell; default; Если свойство явно не вызывается, то считается что вызвано свойство с директивой default;? Вот нашел книжечку там даже для меня достаточно понятно описана работа со свойствами(другие разделы не читал). А на русском такой нет? Сообщение отредактировано: sheka - 29.03.2010 15:52 |
volvo |
![]()
Сообщение
#19
|
Гость ![]() |
А можно ссылку поправить? А то она у тебя какая-то усеченная, с многоточием в середине...
|
sheka |
![]()
Сообщение
#20
|
![]() Я. ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 809 Пол: Мужской Реальное имя: Саша Репутация: ![]() ![]() ![]() |
Исправил.
|
![]() ![]() |
![]() |
Текстовая версия | 25.08.2025 8:33 |