Страницы

Поиск по вопросам

пятница, 13 марта 2020 г.

Наследование с вложенными классами

#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

Комментариев нет:

Отправить комментарий