Как получить доступ к переменным класса в Smalltalk

Я пытаюсь получить доступ к переменной класса в одном из моих классов в Smalltalk.

У меня есть два класса: Class1 и Class2.

Class1 имеет следующие переменные: год месяц день час минута. Class2 имеет следующие переменные: время начала и время окончания. В методе инициализации для Class2 у меня есть следующее:

start-time := Class1 new.
end-time := Class1 new.

Теперь я хочу назначить время начала 2012 года, как мне получить доступ к переменной года во время запуска объекта Class1?

2 ответа

Решение

Так как вы отправляете new В сообщении классам я предполагаю, что вас интересуют переменные экземпляра, а не переменные класса (общие переменные) (см. объектную модель Pharo в обновленном Pharo By Example, чтобы понять различия).

В Pharo все переменные класса / экземпляра являются закрытыми, поэтому способ доступа к ним заключается в создании методов доступа.

Добавьте к своим методам Class1

Class1>>year
    ^ year

Class1>>year: aYear
    year := aYear

И тогда вы можете отправить сообщение классу с соответствующим значением:

Class2>>initialize
    startTime := Class1 new.
    startTime year: 2012.

    "or by using a cascade"
    startTime := Class1 new
        year: 2012;
        yourself.

Если по какой-либо причине вам нужен доступ к переменной без методов доступа, вы можете использовать метапрограммирование:

startTime instVarNamed: #year "meta-getter"
startTime instVarNamed: #year put: 2012 "meta-setter"

В заключение, 'start-time' не является допустимым именем переменной.

Я пытаюсь получить доступ к переменной класса в одном из моих классов в Smalltalk.

Вы уверены, что хотите переменные класса в этом случае? Переменная класса (или атрибут хранится один и только один раз). Она доступна для всех экземпляров этого класса и всех экземпляров всех его подклассов, а также для самих подклассов.

Если вам нужно порождать множество объектов, каждый из которых имеет разное время, или startTime и endTime, то вам нужно использовать более обычные переменные экземпляра.

Однако если вы хотите сохранить один раз и только один раз, тогда да, вы можете хранить информацию в самом классе.

У меня есть два класса: Class1 и Class2.

Я буду называть Class1 "Время", и я буду называть Class2 "StartEndTime"

Время имеет следующие переменные: year month day hour minute, StartEndTime имеет следующие переменные: startTime endTime, В методе инициализации для StartEndTime У меня есть следующее:

startTime := Time new. endTime := Time new.

Теперь я хочу назначить 2012 год startTime, как мне получить доступ к переменной year в объекте startTime?

Соглашение заключается в том, чтобы называть методы доступа получателя с тем же именем, что и атрибут. В этом случае экземпляры объекта Time будут иметь year метод getter, который возвращает год объекта Time.

startTime year затем вернет переменную с именем year

Точно так же методы доступа метода установки имеют то же имя, что и их атрибут, но с суффиксом ':'

startTime year: 2012 Затем установить переменную с именем year в 2012,

Положив их в initialize метод будет означать:

StartEndTime >> initialize
"Returns an initialized StartEndTime"
    startTime := Time new.
    endTime := Time new.
    ^self

Time >> year: anInt
"Returns receiver with its year set to the year argument."
   year := anInt.
   ^self

В рабочей области (или на детской площадке)

"create a new StartEndTime instanceobject"
aStartEndTime := StartEndTime new initialize.
aStartEndTime startTime: 2012.
Другие вопросы по тегам