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