Показать сообщение отдельно
Старый 23.09.2017, 01:43
Appleman вне форума Посмотреть профиль Отправить личное сообщение для Appleman Найти все сообщения от Appleman
  № 34  
Appleman
 
Аватар для Appleman

Регистрация: Dec 2014
Адрес: Санкт-Петербург
Сообщений: 483
Друзья!

Я продолжил свои изыскания в проектировании классов будущей игры и возник новый вопрос. Появился он при переходе от базовых свойств персонажа к специфическим: которые выделяются для пола, профессии и т.п. Пусть условно для мужчин учитывается длина бороды, а для женщин - объём талии. У меня получилось следующее. Я создал новый класс Gender с единственным свойством genderID, которое может принимать значения 0 для женского пола и 1 для мужского, и унаследовал от него два класса GenderMale и GenderFemale. В первом соответственно свойство beardLength, во втором - waistVolume, плюс set- и get-методы для каждого.

Тогда в классе персонажа Character добавился такой set-метод:
Код AS3:
public function set gender(newGenderID:uint):void //Пол
		{
		switch (newGenderID) 
			{
				case 1:
					_gender = new GenderMale(newGenderID);
					break;
				case 0:
					_gender = new GenderFemale(newGenderID);
					break;
				default:
					throw new Error ("Пол персонажа может иметь значение 0-female или 1-male");
			}
		}
Экземпляр класса Character теперь имеет экземпляр класса-потомка Gender в приватной переменной _gender.
Вопрос такой. Чтобы задать либо получить значения свойства, связанного с полом, приходится писать такой код. Например, для нашей бороды:

В классе Character:
Код AS3:
public function set beardLength(bewBeardLength:Number):void {_gender.beardLength = bewBeardLength; }
Теперь в Gender:
Код AS3:
public function set beardLength(bewBeardLength:Number):void {}
Наконец, в GenderMale:
Код AS3:
override public function set beardLength(bewBeardLength:Number):void {_beardLength = bewBeardLength}
Аналогично с get-методом. В принципе работает, но как-то чересчур громоздко выглядит. И этим активно не нравится. Если на каждое подобное свойство писать методы в трёх местах, то это получится мясо и фарш, а не код. Обращаться напрямую character._gender.beardLength тоже не выходит, т.к. переменная _gender объявлена как private и менять её статус не вижу никакого резона. в общем, need help. Заранее спасибо.