Могу ли я изменить типы классов в установщике с объектно-ориентированным языком? - PullRequest
0 голосов
/ 09 марта 2010

Вот формулировка проблемы: вызов метода установки для объекта должен привести к тому, что объект изменится на объект другого класса, какой язык может это поддерживать? Ex. У меня есть класс под названием «Человек» (Родительский класс), и двое детей, а именно «Малыш» и «Старик», являются его детьми, потому что они переопределяют поведение в Человеке, которое называется ходьбой. (т. е. малыш иногда ходит, опираясь руками и ногами на колени, а старик использует палку, чтобы поддержать себя).

Класс Man имеет атрибут age, у меня есть сеттер для Man, скажем setAge(int ageValue). У меня 3 предмета, 2 малыша, 1 старик. (Система работает и работает, я думаю, когда мы говорим объекты, это очевидно). Я сделаю этот вызов, toddler.setAge(80), я ожидаю, что малыш изменится на объект типа Старик. Это возможно? Пожалуйста, предложите.

Спасибо

Ответы [ 8 ]

2 голосов
/ 09 марта 2010

Это звучит для меня как модель не так. То, что у вас есть, это Person, чья относительная временная группировка и определенное поведение меняются с возрастом.

Возможно, вам нужен метод с именем getAgeGroup(), который возвращает соответствующий Enum, в зависимости от текущего возраста. Вам также нужен внутренний объект состояния, который инкапсулирует поведение, зависящее от состояния, которому ваше Person делегирует поведение, которое меняется с возрастом.

Тем не менее, динамическое изменение типа экземпляра объекта, вероятно, будет возможно только с динамически типизированными языками; конечно, это не выполнимо в Java и, вероятно, не выполнимо в C # и большинстве других статически типизированных языков.

1 голос
/ 09 марта 2010

Если ваш язык не поддерживает изменение класса классификации во время выполнения, взгляните на шаблоны декоратор и стратегия .

1 голос
/ 09 марта 2010

Это общая проблема, которую вы можете решить, используя комбинацию ОО моделирования и шаблонов проектирования.

Вы будете смоделировать класс так, как это происходит, когда Toddler и OldMan наследуют от базового класса Man. Вам нужно будет ввести класс Proxy (см. Шаблон проектирования GoF) в качестве доступа к вашему классу Man. Внутренне прокси содержит объект / указатель / ссылку man на Toddler или OldMan. Прокси-сервер представит все интерфейсы, предоставляемые классом Man, чтобы вы могли использовать его как есть, и в вашем сценарии вы будете реализовывать setAge, аналогично псевдокоду ниже:

public void setAge(int age)
{
   if( age > TODDLER_MAX && myMan is Toddler)
     myMan = new OldMan();
   else 
    .....
   myMan.setAge(age);   
}
0 голосов
/ 10 марта 2010

Я удивлен, что никто до сих пор не заметил, что это именно тот случай для Государственного шаблона проектирования (хотя @Fadrian фактически довольно точно описал основную идею шаблона - не упоминая его название ).

Паттерн состояния - это паттерн проектирования поведенческого программного обеспечения, также известный как шаблон объектов для состояний. Этот шаблон используется в компьютере программирование для представления состояния объекта. Это чистый способ для объект частично изменит свой тип во время выполнения.

Ссылочная страница содержит примеры на Java и Python. Очевидно, что это может быть реализовано и в других строго типизированных языках. (Слаботипизированные языки OTOH не нуждаются в State, поскольку они поддерживают такое поведение «из коробки».)

0 голосов
/ 09 марта 2010

Common Lisp может: использовать универсальную функцию CHANGE-CLASS.

0 голосов
/ 09 марта 2010

Javascript может сделать это. В любой момент вы можете взять существующий объект и добавить к нему новые методы или изменить его существующие методы. Это можно сделать на уровне отдельных объектов.

Дуглас Крокфорд пишет об этом в Классическое наследование в JavaScript :

Увеличение класса

Динамизм JavaScript позволяет нам добавлять или заменить методы существующего учебный класс. Мы можем вызвать метод метода в любое время, и все присутствующие и будущие экземпляры класса будут есть этот метод. Мы можем буквально продлить класс в любое время. Наследование работает задним числом. Мы Назовите это Class Augmentation, чтобы избежать путаница с Java расширяется, что означает что-то еще.

Увеличение объекта

В статических объектно-ориентированных языки, если вы хотите объект, который немного отличается от другого объект, вам нужно определить новый учебный класс. В JavaScript вы можете добавить методы для отдельных объектов без необходимость дополнительных занятий. это имеет огромную силу, потому что вы можете написать гораздо меньше классов и занятия, которые вы пишете, могут быть очень проще. Напомним, что JavaScript объекты похожи на хеш-таблицы. Вы можете добавлять новые значения в любое время. Если значение является функцией, тогда оно становится способ.

0 голосов
/ 09 марта 2010

Интересно, действительно ли субклассирование - лучшее решение здесь? Свойство (возможно, enum), в котором есть разные типы людей, поскольку его возможные значения являются одной из альтернатив. Или, в этом отношении, производное свойство или метод, который сообщает вам тип человека в зависимости от возраста.

0 голосов
/ 09 марта 2010

Объекты в Python могут изменить свой класс, установив атрибут __class__.В противном случае используйте шаблон «Стратегия».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...