190 Глава 11. Основы строительства
так уж часто будете. Исключение составляет класс Object — суперкласс для
всех других классов, и класс ViewManager — суперкласс для окон прило-
жений, о котором пойдет речь в разделе 16.2.
Все это означает, что, когда вы создаете собственные повторно исполь-
зуемые классы, вы сначала должны задуматься о том, как пользователь бу-
дет работать с их экземплярами, а уж потом о том, как он сможет из них
наследовать. Проектирование наследования — достаточно сложная задача.
Формирование объектов из частей, разработанных для совместного ис-
пользования, позволяет обойти ограничение системы, связанное с одиноч-
ным наследованием (каждый класс имеет точно один непосредственный
суперкласс, а не комбинацию многих родительских классов). Каждая часть
составного объекта имеет собственное место в иерархии наследования. По-
пытка найти в иерархии место для такого класса, экземпляр которого пред-
ставлял бы объект, эквивалентный составному, всегда будет приводить к
компромиссу.
Но на одних пожеланиях повторно используемого класса не создашь.
Каким еще правилам стоит следовать? Наиболее очевидно, что всегда на-
до стараться создавать код общего вида. Возможности, предоставляемые
системой Смолток, основаны на том, что язык Смолток — это язык «без
типов» (“typeless”). Если в интерфейсе создаваемого класса не нужно огра-
ничивать тип объекта, то и не ограничивайте его. Если ограничения необхо-
димы, старайтесь сделать их минимальными. Например, если метод прини-
мает в качестве параметра набор, пишите код, работающий с максимально
большим числом разных наборов, а не только с массивами.
Один из способов сделать класс общим со стоит в том, чтобы избегать в
теле методов прямого использования констант. Если подобное имеет смысл,
встраивайте их в интерфейс в качестве методов. Конечно, это несколько
усложнит интерфейс класса, поэтому надо стараться создавать более про-
стые версии методов с меньшим числом параметров. А эти методы, возмож-
но, будут вызывать более сложные методы со значениями по умолчанию
для некоторых параметров. Такой прием часто используется в иерархии
классов системы, где он иногда проходит много уровней все возрастающей
общности (и возрастающего числа параметров), пока не возникнет метод,
который фактически вызывается для исполнения и выполняет всю работу.
Старайтесь разрабатывать классы так, чтобы пользователи знали только о
тех возможностях, которые они реально используют.
В заключение стоит еще сказать, что только опыт эксплуатации создан-
ного класса расставит все по своим местам. Нельзя предсказать будущее.
Но если класс удовлетворяет основным требованиям, не стоит «на предви-
дение» тратить время.