Java расширяет классы - делится полями расширенного класса в суперклассе - PullRequest
0 голосов
/ 07 апреля 2010

РЕДАКТИРОВАНИЕ:

Прямо в точку ... У меня есть класс

public class P_Gen{  
    protected String s;
    protected Object oP_Gen;
    protected Object oP_Gen2;
    public P_Gen(String str){
       s = str;
       oP_Gen = new MyClass(this);
       oP_Gen2 = new MyClass2(this);
    }
}  

Расширенный класс:

public class P extends P_Gen{  
    protected Object oP;  
    public P(String str){    
       super(str);  
       oP = new MyClass(this);
    }
} 

MyClass:

public class MyClass{  
    protected Object oMC;
    public MyClass(P extendedObject){
       this.oMC = extendedObject.oP;
    }
}

MyClass2:

public class MyClass2{  
    protected Object oMC2;
    public MyClass(P_Gen thisObject){
       this.oMC2 = thisObject.oP;
    }
}   

Показанный выше класс P_Gen выдает ошибку для строки:

oP_Gen = new MyClass(this);  

, в которой говорится "не удается найти конструктор символов MyClass (P_Gen)"

Чего я хочу добиться, так это сделать P.oP доступным из MyClass2.

Моей первоначальной мыслью было, что P.this === P_Gen.this.Другими словами, P_Gen исчезает при вызове из super(), и остается только P расширенный класс.

Ответы [ 3 ]

0 голосов
/ 08 апреля 2010

ok,

  1. В классе MyClass2 конструктор должен называться 'MyClass2'
  2. Почему бы вам не задать такие конструкторы так:
public MyClass(P_Gen thisObject){...}
public MyClass2(P_Gen thisObject){...}

Делая это, вы можете сделать что-то вроде:

new MyClass(new P());

Также вам нужно привести thisObject к Pвнутри MyClass и MyClass2 конструкторов, так что вы можете получить переменную oP.Я рекомендую вам немного больше рассказать о наследовании Java.

JP

0 голосов
/ 08 апреля 2010

После хорошего ночного сна .... это не то, что я хотел сделать, это неправильно, но мой подход вообще. Я вернулся к своему началу ООП. Мне стыдно. В любом случае, я дал ответ @juanp, потому что он сказал: «Моя рекомендация 4 - немного больше узнать о наследовании java».

Для тех, кому интересно, вот как это должно выглядеть:

Сгенерированный класс P_Gen:

public abstract class P_Gen{
    protected String s;
    protected Object oP;
    public P_Gen(String str){
        this.s = str;
        init(str);
    }

    protected void init(String str){
        if(this instanceof P){
            oP = new MyClass((P)this);
        }
    }
}

Расширенный класс P:

public class P extends P_Gen{  
    public String sSTR;
    public P(String str){
       super(str);
    }

    @Override
    protected void init(String str){
        this.sSTR = str;
        this.oP = new MyClass(this);
    }
}

Класс MyClass:

public class MyClass{
    protected Object oMC;
    public MyClass(P extendedObject){
       this.oMC = extendedObject.sSTR;
    }
}

Я переместил создание экземпляра MyClass из конструктора в функцию init. Эта функция инициализации затем переопределяется в расширенном классе ..... очень простые вещи, которые я знаю.

Еще более простой добавленный в мой класс P_Gen аннотация, чтобы предотвратить его непосредственное создание. Я также мог бы объявить абстрактный метод init в P_Gen.

Все это заставляет меня думать, что может быть .... :-) ... в другой день. Спасибо, что помог мне вернуться на правильный путь.

0 голосов
/ 07 апреля 2010

Меня немного смущает ваш вопрос (и ваш код, где нигде нет метода doSomething ()), но вы можете извлечь выгоду из того, что P_Gen - это абстрактный класс с абстрактным методом doSomething (). Тогда P может реализовать этот метод, и все, что имеет ссылку на P_Gen, может вызвать его (и получить реализацию в P, если это тот экземпляр).

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