(Java) Почему суперкласс может иметь переменные типа подкласса? - PullRequest
0 голосов
/ 07 ноября 2019

Я видел этот код в «Взломе кодирования». Интервью

abstract class Entry {
    protected Directory parent;
    protected long created, lastUpdated, lastAccessed;
    protected String name;

    public Entry(String n, Directory p) {
        this.name = n;
        this.parent = p;
        created = System.currentTimeMillis();
        lastUpdated = System.currentTimeMillis();
        lastAccessed = System.currentTimeMillis();
    }
    ...
}

class Directory extends Entry {
    ...
}

Если Directory наследует от Entry, почему у 'Entry' может быть переменная 'Directory-type'? Я не понимаю, для меня это было похоже на ситуацию с курицей и яйцом. Может кто-нибудь объяснить это? Большое спасибо!

Ответы [ 3 ]

1 голос
/ 07 ноября 2019

Это на самом деле не проблема. Когда вы думаете об этом, он ничем не отличается от structure in C, который содержит другие свои структуры или в следующем примере.

class Node {
   Node left;
   Node right;
}

Тот факт, что в примере, который выпроцитированное это просто иллюзия.

class A {
   public B b_obj
   public int n;
   public int r;
}

class B extends A {
   public in q;
}

So B has access to the following fields.
    B b_obj
    int n
    int r
    int q 

Но, как и во всех отношениях классов, если вы назначите экземпляр B переменной типа A, то q не будет доступно. Но A всегда может получить доступ к элементам B через свой объект B, если он был назначен.

0 голосов
/ 08 ноября 2019

Язык или концепция ООП не мешают никому писать какую-либо структуру кода, хорошую или плохую.

0 голосов
/ 07 ноября 2019

Вы можете создать экземпляр объекта parent как экземпляр класса Entry. И поэтому нет никаких причин, по которым экземпляр родительского типа нельзя пустить внутрь как поле в дочернем классе.
Кроме того, что если родительский объект может быть интерфейсом, и этот интерфейс реализуется другим классом, который имеетОтношение наследования с вашим текущим классом?
Примерно так:

    interface Directory {

    }

    abstract class Entry {
        protected Directory directory;
    }

    class Folder implements Directory {

    }

Таким образом, нет смысла запрещать родительский экземпляр как поле в дочернем классе. Также обратите внимание на полиморфизм во время выполнения.

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