Если вы используете один класс для представления узла с дочерними элементами или без него, вы можете определить, является ли узел листовым, посмотрев, есть ли у него дочерние элементы. Читайте свойства. Если дочерние элементы нулевые (или пустые, в зависимости от того, как вы их пишете), тогда это лист. Это просто.
Если вы определяете отдельный класс для представления листового узла, у узла теперь есть два способа быть листовым узлом. Это может быть тип «листовой узел», или это может быть узел ветви без дочерних узлов. Это немного неловко, и если узел не является неизменным или не может быть создан с нулевыми дочерними элементами, а дочерние элементы не могут быть установлены на нулевые значения, это означает, что вам всегда придется выполнять обе проверки. Это листовой узел? Сначала проверьте его тип. Если это не тип конечного узла, также проверьте, есть ли у него дочерние элементы. Тебе придется сделать то же самое, пройдя по нему. Сначала убедитесь, что это не тип листа и также , посмотрите, есть ли у него дети.
Если узлы дерева неизменны, это может привести к путанице при построении дерева. Вы не можете создать узел, не зная сначала, есть ли у него дочерние элементы, и если у него есть дочерние элементы, вы должны предоставить их. И то же самое относится и к тем детям. (Вероятно, есть сценарий для этого, но ваши узлы не являются неизменяемыми, поэтому я предполагаю, что это не то, что вы хотели. И даже в этом сценарии определение отдельного класса все равно сделает обход дерева более эффективным.)
Это также означает определение новых типов, которые ничего не делают, но представляют существующий тип в другом состоянии. Другими словами, узел без дочерних элементов уже представлен "нормальным" классом узла ветви. Легко осмотреть узел и посмотреть, есть ли у него дети. Тот факт, что с типом «листовой узел» вам придется проверять как тип, так и свойства, и что обе проверки по сути скажут вам одно и то же, показывает, почему тип будет избыточным. Это буквально просто еще один способ обозначить то же самое.
Определение отдельного типа означает, что новый тип существует только для отображения существующего типа в определенном состоянии. В большинстве случаев мы хотим взаимодействовать с объектами, вызывая их методы или проверяя их свойства, а не проверяя, какой у них тип. Но это то, что вам нужно сделать. Вы должны всегда проверять тип каждого узла. Мы не должны этого делать, если они служат той же цели, что и проверка свойств.