2017-05-28 1 views
1

Est-il acceptable (pour les entités java et SOLID) d'étendre les classes abstraites afin de définir des propriétés à partir de la super classe? Ce que je veux accomplir est d'appliquer différentes valeurs à p2 en fonction de ce que p1 a et aussi des valeurs p3 dépendra de ce que la valeur de p2 est (quelque chose de similaire lorsque vous cascade menus déroulants). Ce scénario peut-il être traité avec un motif de conception?Définition de super-propriétés à l'aide de sous-classes abstraites

public interface Iface{ 
    public void set_p1(int i); 
    public void set_p2(int i); 
    public void set_p3(int i); 
} 

public abstract class A implements Iface{ 
    private int p1; 
    private int p2; 
    private int p3; 

    public void set_p1(int i){ 
     this.p1 = i; 
    } 

    public void set_p2(int i){ 
     this.p2 = i; 
    } 

    public void set_p3(int i){ 
     this.p3 = i; 
    } 
} 

Ici, je mis p1 à 100

public abstract class setOne extends A { 
    public setOne(){ 
     set_p1(100); 
    } 
} 

maintenant je mis p2 en fonction des valeurs de p1

public abstract class setTwo extends setOne { 
    public setTwo(){ 
     //do some work using p1 
     set_p2(200); 
    } 
} 

maintenant j'instancier ma setTwo classe abstraite

public class TestClass extends setTwo { 
    public TestClass(){ 
     super(); 
    } 
} 

TestClass myObj = new TestClass(); 

maintenant j'attends les valeurs de objet e comme suit:

myObj.p1 = 100 

et

myObj.p2 = 200; 
+0

Tout fonctionne comme ci-dessus décrivent myObj.p1 est en effet 100 et même pour myObj.p1 est 100. Je suis nouveau à java, donc je veux voir si ce que je l'ai fait avec les directeurs d'école respecte solides et avec la façon dont l'héritage est utilisé en Java. merci. –

Répondre

1

C'est quelque chose implantation complexe. Je pense que vous avez trop penser à un seul principe responsable.

La conception basée sur ce que vous avez à faire dépend de p1 et p2. vous pouvez simplement utiliser POJO pour venir ici.

public abstract class A { 
    private int p1; 
    private int p2; 
    private int p3; 

    public void setP1(int i){ 
     this.p1 = i; 
    } 

    public void setP2(int i){ 
     //do some work using p1 
     this.p2 = i; 
    } 

    public void setP3(int i){ 
     this.p3 = i; 
    } 
} 

Si vous devez effectuer une certaine valeur de base de la logique avancée, vous pouvez fournir une implémentation à la méthode setP2.

public interface NumberFunction { 
    int doCalculate(int number); 
} 

Et de modifier la fonction comme ci-dessous.

public void setP2(int i, NumberFunction function){ 
    int functionResult = function.doCalculate(p1); 
    this.p2 = i; 
} 

Donc la fonction de nombre tient responsable de modifier vos nombres. et Une classe responsable de garder les valeurs.

Espérons que cela vous aidera.