#java #наследование
class SinglyLinkedList extends AbstractList { protected Node first; protected Node last; protected int size; static class Node { Node next; Object val; Node(Node next, Object val) { this.next = next; this.val = val; } Node() { this.next = null; this.val = null; } } Я собираюсь от односвязного списка унаследовать двусвязный список, при этом в вложенном классе, который будет находиться в DoublyLinkedList должно быть ещё одно поле и соответственно конструктор. public class DoublyLinkedList extends SinglyLinkedList { static class Node extends SinglyLinkedList.Node { Node prev; Node(Node next, Object val, Node prev) { super(next, val); this.prev = prev; } } Уверен, что делаю это не правильно.
Ответы
Ответ 1
Правильно будет вынести общую логику списков в абстрактный класс и унаследовать от него оба списка. Если Node хранит только состояние, то пусть он будет отличаться в реализациях списка. Либо его можно вынести в protected / package-private классы, для того чтобы была видимость только внутри пакета. Статические внутренние классы не нарушают SOLID, с их помощью обычно выполняют логическую группировку сущностей внутри класса. В вашем случае плохо то, что вы усложняете дизайн, что сопряжено в последующей тестируемостью и расширяемостью кода, не извлекая при этом никакой практической пользы. Примеры из JDK: AbstractSequentialList LinkedList
Комментариев нет:
Отправить комментарий