Как получить доступ к переменным класса в 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.