Можем ли мы обеспечить наследование после индивидуального создания объектов суперкласса?ObjA obj = новый ObjB (); - PullRequest
0 голосов
/ 20 октября 2018

Есть ли способ принудительного наследования между объектами после их индивидуального создания?Рассмотрим пример, приведенный ниже

    class Test{        
        class publisher{
            public String pubName;
            //10-15 other members here
            public String getPublisher(){
                return pubName;
            }
            public void setName(String name){
                pubName = name;
            }
        }
        class author extends publisher{
            public String authorName;
            //5-10 other members here
            public String getAuthor(){
                return authorName;
            }
            @Override
            public void setName(String name){
                authorName = name;
            }
        }
        public static void main(String Args[]){
            publisher pub1 = new publisher();
            pub1.setName("Amanda Book House");

            //I want to do something like this below?
            pub1 auth1 = new author();
            //I want to create an author who has inherited information from pub1 
            //so auth1.getPublisher() should give me Amanda Book House 

        }
    }

Поэтому, чтобы быть конкретным, я хочу знать, существует ли способ при создании объекта производного класса из информации объекта базового класса, который уже был создан.Я знаю, что когда создается производный объект, делается неявный вызов конструктора суперкласса.Как это входит в картину для этого случая?

1 Ответ

0 голосов
/ 20 октября 2018

Нет, вы не можете этого сделать.Вместо этого вы можете убедиться, что базовые классы (Publisher в вашем случае) имеют конструкторы копирования , так что вы можете передать экземпляр Publisher конструктору Author в скопируйте его состояние в строящийся объект:

class Publisher {
    private String pubName;
    public Publisher(Publisher other) { // ***
        this.pubName = other.pubName;   // ***
    }                                   // ***
    //10-15 other members here
    public String getPublisher(){
        return pubName;
    }
    public void setName(String name){
        pubName = name;
    }
}

class Author extends Publisher{
    private String authorName;
    public Author(Publisher pub) {      // ***
        super(pub);                     // ***
    }                                   // ***
    //5-10 other members here
    public String getAuthor(){
        return authorName;
    }
    @Override
    public void setName(String name){
        authorName = name;
    }
}

Итак:

Publisher pub1 = new publisher();
pub1.setName("Amanda Book House");
Author auth1 = new Author(pub1);        // *** *Copies* the state from pub1

Важно отметить, что это делает copy ;если вы измените состояние pub1 позже (например, измените имя), это не повлияет на состояние auth1.


Примечание: вы, очевидно, можете сделатьчто вам нравится в вашем собственном коде, но при обращении за помощью, пожалуйста, следуйте стандартным соглашениям об именах Java, важно, чтобы ваш код читался другими.

Примечание 2: Если у вас есть средства доступа к чему-либо (например, pubName), переменная экземпляра, содержащая ее, должна быть закрытой.

Я проделал обе эти вещи в приведенном выше.

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