Java класс мұрасы және суперкласс әдістерін бұғаттау

Қазіргі уақытта қарапайым плагиналы бағдарламаны жасап жатырмын. Менің мәселе плагиннің барлық базалық плагин өрістеріне/әдістеріне қатынасуын қаламаймын. Мысалға:

public abstract class BasePlugin {
    private int x; //Mysterious x
    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

Егер сіз х орнатуға ешқандай мүмкіндік жоқ екенін түсінсеңіз, бұл жұмыс істейтін болады.

Мен не істей аламын? Мен x-ды өзгерте алмайтын подкласс (плагин) жасауды қалаймын, бірақ ол мәнді оқуға рұқсат етіңіз. Мәні кем дегенде бір рет жасалуы керек (бұл жеткілікті).

EDIT: конструктор көбінесе жұмыс істейді, бірақ, мысалы, егер менде болса:

public abstract class BasePlugin {
    private List x; //Mysterious x
    public abstract void update(); //update func that may need x, but can't change it
    protected final List getX() {return x;} //x accessor
    public BasePlugin(List y) {x = y;}
}

public class Plugin {
    public Plugin(List y)
    {
        super(y);
        y.remove(0); //Will it work?
    }
}
0
қандай проблема? бұл жұмыс
қосылды автор nachokk, көзі
Құрылыста оны орнатуды қалайсыз ба? Егер солай болса, бұл шешуге оңай.
қосылды автор Michael Myers, көзі
Құрылыста оны орнатуды қалайсыз ба? Егер солай болса, бұл шешуге оңай.
қосылды автор Michael Myers, көзі
@MichaelMyers конструкцияларда оны орнатқан кезде маған жеткілікті (бірде жасау кезінде).
қосылды автор noisy cat, көзі
@MichaelMyers конструкцияларда оны орнатқан кезде маған жеткілікті (бірде жасау кезінде).
қосылды автор noisy cat, көзі
Мен X-ні ешқандай жолмен белгілей алмаймын. Не болмаса, қалайша білмеймін.
қосылды автор noisy cat, көзі

7 жауаптар

Абстракт класына конструкторлар рұқсат етіледі, сондықтан BasePlugin үшін параметрсіз конструктор жасай аласыз:

public abstract class BasePlugin {
    private int x; //Mysterious x
    public BasePlugin() {
        x = 42;
    }
    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

Енді қосылатын модуль жасалса, x 42 мәніне орнатылады. Сізге бұл конструкторды пайдалану үшін плагиндерге қандай да бір кодты өзгерту қажет емес.


Редакцияланған сұраққа жауап беру үшін: Егер x - Тізім болса және оны плагин модульдерін өзгертуді қаламасаңыз, конструктор оны көшіріп, оны unmodifiable тізімі . Әйтпесе, кез-келген плагин getX() деп атауға болады (myObject) .

public BasePlugin(List y) {
    List temp = new ArrayList();
    Collections.copy(temp, y);//shallow copy of the list
    this.x = Collections.unmodifiableList(temp);
}

Енді плагин конструкторы болса

public Plugin(List y)
{
    super(y);
    y.remove(0); //Will it work?
}

BasePlugin тізіміне әсер етпейді.

2
қосылды
@kittyPL сіздің тізіміңізді тіпті basePlugin сыныбында да өзгерте алмайтындығына назар аударыңыз, себебі сіз UnsopportedOperationException атауын тастасаңыз немесе қосып көрсеңіз
қосылды автор nachokk, көзі
@kittyPL: тізімдер өзгермейді, сондықтан сізде аксессуар бар болса және плагиндердің тізімді өзгерткісі келмесе, оны unmodifiable list .
қосылды автор Michael Myers, көзі
Мен сұраққа редакция жасадым, қараңызшы :)
қосылды автор noisy cat, көзі
Жақсы. Егер параметр Parametr сияқты күрделі нысан болса, не болады? Содан кейін пайдаланушы оны супер (x) кейін қайта өңдей алады.
қосылды автор noisy cat, көзі
Маған нақты қажет болды! Рахмет! Жауапты қабылдай отырып, бұл жай ғана мінсіз, ал қалған бөліктерді де бірінші бөлігін шешеді.
қосылды автор noisy cat, көзі

Абстракт класына конструкторлар рұқсат етіледі, сондықтан BasePlugin үшін параметрсіз конструктор жасай аласыз:

public abstract class BasePlugin {
    private int x; //Mysterious x
    public BasePlugin() {
        x = 42;
    }
    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

Енді қосылатын модуль жасалса, x 42 мәніне орнатылады. Сізге бұл конструкторды пайдалану үшін плагиндерге қандай да бір кодты өзгерту қажет емес.


Редакцияланған сұраққа жауап беру үшін: Егер x - Тізім болса және оны плагин модульдерін өзгертуді қаламасаңыз, конструктор оны көшіріп, оны unmodifiable тізімі . Әйтпесе, кез-келген плагин getX() деп атауға болады (myObject) .

public BasePlugin(List y) {
    List temp = new ArrayList();
    Collections.copy(temp, y);//shallow copy of the list
    this.x = Collections.unmodifiableList(temp);
}

Енді плагин конструкторы болса

public Plugin(List y)
{
    super(y);
    y.remove(0); //Will it work?
}

BasePlugin тізіміне әсер етпейді.

2
қосылды
@kittyPL сіздің тізіміңізді тіпті basePlugin сыныбында да өзгерте алмайтындығына назар аударыңыз, себебі сіз UnsopportedOperationException атауын тастасаңыз немесе қосып көрсеңіз
қосылды автор nachokk, көзі
@kittyPL: тізімдер өзгермейді, сондықтан сізде аксессуар бар болса және плагиндердің тізімді өзгерткісі келмесе, оны unmodifiable list .
қосылды автор Michael Myers, көзі
Мен сұраққа редакция жасадым, қараңызшы :)
қосылды автор noisy cat, көзі
Жақсы. Егер параметр Parametr сияқты күрделі нысан болса, не болады? Содан кейін пайдаланушы оны супер (x) кейін қайта өңдей алады.
қосылды автор noisy cat, көзі
Маған нақты қажет болды! Рахмет! Жауапты қабылдай отырып, бұл жай ғана мінсіз, ал қалған бөліктерді де бірінші бөлігін шешеді.
қосылды автор noisy cat, көзі

Абстракт класына конструкторлар рұқсат етіледі, сондықтан BasePlugin үшін параметрсіз конструктор жасай аласыз:

public abstract class BasePlugin {
    private int x; //Mysterious x
    public BasePlugin() {
        x = 42;
    }
    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

Енді қосылатын модуль жасалса, x 42 мәніне орнатылады. Сізге бұл конструкторды пайдалану үшін плагиндерге қандай да бір кодты өзгерту қажет емес.


Редакцияланған сұраққа жауап беру үшін: Егер x - Тізім болса және оны плагин модульдерін өзгертуді қаламасаңыз, конструктор оны көшіріп, оны unmodifiable тізімі . Әйтпесе, кез-келген плагин getX() деп атауға болады (myObject) .

public BasePlugin(List y) {
    List temp = new ArrayList();
    Collections.copy(temp, y);//shallow copy of the list
    this.x = Collections.unmodifiableList(temp);
}

Енді плагин конструкторы болса

public Plugin(List y)
{
    super(y);
    y.remove(0); //Will it work?
}

BasePlugin тізіміне әсер етпейді.

2
қосылды
@kittyPL сіздің тізіміңізді тіпті basePlugin сыныбында да өзгерте алмайтындығына назар аударыңыз, себебі сіз UnsopportedOperationException атауын тастасаңыз немесе қосып көрсеңіз
қосылды автор nachokk, көзі
@kittyPL: тізімдер өзгермейді, сондықтан сізде аксессуар бар болса және плагиндердің тізімді өзгерткісі келмесе, оны unmodifiable list .
қосылды автор Michael Myers, көзі
Мен сұраққа редакция жасадым, қараңызшы :)
қосылды автор noisy cat, көзі
Жақсы. Егер параметр Parametr сияқты күрделі нысан болса, не болады? Содан кейін пайдаланушы оны супер (x) кейін қайта өңдей алады.
қосылды автор noisy cat, көзі
Маған нақты қажет болды! Рахмет! Жауапты қабылдай отырып, бұл жай ғана мінсіз, ал қалған бөліктерді де бірінші бөлігін шешеді.
қосылды автор noisy cat, көзі

Constructor Injection бағдарламасын пайдалануға болады.

public abstract class BasePlugin{

  private int x;

  public BasePlugin(int x){
   this.x=x;
  }

  public abstract void update(); //update func that may need x, but can't change it
  protected final int getX() {return x;} //x accessor

}

Және сіздің балаларыңызда

public class Plugin extends BasePlugin{


  public Plugin(int x){
    super(x);
  }

}
1
қосылды
сіз өзіңіздің терең клоның() әдісін енгізуіңіз керек. unmodifiableList түрлендіру үшін
қосылды автор nachokk, көзі
Мен сұраққа редакция жасадым, қараңызшы :)
қосылды автор noisy cat, көзі

Constructor Injection бағдарламасын пайдалануға болады.

public abstract class BasePlugin{

  private int x;

  public BasePlugin(int x){
   this.x=x;
  }

  public abstract void update(); //update func that may need x, but can't change it
  protected final int getX() {return x;} //x accessor

}

Және сіздің балаларыңызда

public class Plugin extends BasePlugin{


  public Plugin(int x){
    super(x);
  }

}
1
қосылды
сіз өзіңіздің терең клоның() әдісін енгізуіңіз керек. unmodifiableList түрлендіру үшін
қосылды автор nachokk, көзі
Мен сұраққа редакция жасадым, қараңызшы :)
қосылды автор noisy cat, көзі

Сіз өзіңіздің қасиеттеріңізді субклассы арқылы алу үшін конструкторды қоса аласыз:

public abstract class BasePlugin {
    private int x; //Mysterious x

    public BasePlugin(int x) {
        this.x = x;
    }

    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}
1
қосылды

Сіз өзіңіздің қасиеттеріңізді субклассы арқылы алу үшін конструкторды қоса аласыз:

public abstract class BasePlugin {
    private int x; //Mysterious x

    public BasePlugin(int x) {
        this.x = x;
    }

    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}
1
қосылды