OVH Cloud OVH Cloud

instanciation d'une classe abstraite ...... :(

4 réponses
Avatar
Etienne Baudin
Bonjour,

j'essaye de réaliser une classe abstraite "matrice" qui ne dépends pas d'une
implémentation particulière (je veux pouvoir l'implémenter par un tableau à
2 dimension, par une matrice creuse (tableau) etc...). J'ai pour cela 2
méthodes abstraites :

abstract float get (int i, int j)
abstract void put (int i, int j, float val) pour acceder aux coefficients

Dans cette classe abstraite j'aimerais aussi coder l'opération d'addition
matricielle suivant cette spécification :
(Matrice est ma classe abstraite)

public Matrice addition (Matrice M);
et l'utiliser comme ca :

Destination = Source1.addition(Source2);

Cependant,
dans ma méthode addition, si je veux retourner une nouvelle matrice, je ne
vois pas d'autre solution que de faire un Matrice M = new Matrice, ce qui
déplait fortement au compilo, comme prévu. (classe abstraite qui ne peut
être instanciée).

Quel est l'idée manquante ?

Merci,
Etienne

************ CODE ************

package MatTransform;

abstract class Matrice
{

............

abstract public float get(int ligne, int colonne);
abstract public void put(int ligne, int colonne, float val);

..............

public Matrice addition (Matrice M)
{
Matrice D = new Matrice (M.IntervalleLigne, M.IntervalleColonne); //
impossible......

for (int i = M.IntervalleLigne.valeurMin();
i<=M.IntervalleLigne.valeurMax(); i++)
{
for (int j = M.IntervalleColonne.valeurMin();
j<=M.IntervalleColonne.valeurMax(); j++)
{
D.put(i,j, this.get(i,j)+M.get(i,j));
}
}
return D;

}
}

4 réponses

Avatar
Emmanuel Puybaret
j'essaye de réaliser une classe abstraite "matrice" qui ne dépends pas d'une
implémentation particulière (je veux pouvoir l'implémenter par un tableau à
2 dimension, par une matrice creuse (tableau) etc...). J'ai pour cela 2
méthodes abstraites :

abstract float get (int i, int j)
abstract void put (int i, int j, float val) pour acceder aux coefficients

Dans cette classe abstraite j'aimerais aussi coder l'opération d'addition
matricielle suivant cette spécification :
(Matrice est ma classe abstraite)

public Matrice addition (Matrice M);
et l'utiliser comme ca :

Destination = Source1.addition(Source2);

Cependant,
dans ma méthode addition, si je veux retourner une nouvelle matrice, je ne
vois pas d'autre solution que de faire un Matrice M = new Matrice, ce qui
déplait fortement au compilo, comme prévu. (classe abstraite qui ne peut
être instanciée).

Quel est l'idée manquante ?


Il y a plein de solutions possibles mais la plus simple est d'instancier un
objet de la même classe que this par exemple:
Matrice M = (Matrice)this.getClass().newInstance();
Dans ce cas, il faut que la classe de l'objet est un constructeur sans
paramètre.

Cordialement
--
Emmanuel PUYBARET
Email :
Web : http://www.eteks.com
Auteur du Cahier du programmeur Java [1] / Editions Eyrolles :
http://www.eteks.com/services/cahierjava1.html

Avatar
Etienne Baudin
Il y a plein de solutions possibles mais la plus simple est d'instancier
un

objet de la même classe que this par exemple:
Matrice M = (Matrice)this.getClass().newInstance();
Dans ce cas, il faut que la classe de l'objet est un constructeur sans
paramètre.


Ok, merci. Sinon, par simple curiosité, quelles sont les autres méthodes
envisageable ?

Etienne

Avatar
Vincent Brabant
Il y a plein de solutions possibles mais la plus simple est d'instancier
un objet de la même classe que this par exemple:
Matrice M = (Matrice)this.getClass().newInstance();
Dans ce cas, il faut que la classe de l'objet est un constructeur sans
paramètre.



Ok, merci. Sinon, par simple curiosité, quelles sont les autres méthodes
envisageable ?

Etienne


Créer une autre méthode abstraite,

par exemple abstract Matrice createNewMatrice()
Et donc chaque implémentation de Matrice devrait l'implémenter
correctement. Et pourrait utiliser ses attributs internes pour créer
correctement la matrice de résultat, si besoin est.
Et tu aurais donc dans addition, quelque chose du genre
Matrice m = createNewMatrice();
au lieu de Matrice m = new Matrice();

Évidemment, il faut alors que chaque classe dérivée de Matrice
implémente cette méthode.

Vincent


Avatar
Nicolas Repiquet
"Emmanuel Puybaret" a écrit dans le message news:
BBC0068F.C5DA%

Il y a plein de solutions possibles mais la plus simple est d'instancier
un

objet de la même classe que this par exemple:
Matrice M = (Matrice)this.getClass().newInstance();
Dans ce cas, il faut que la classe de l'objet est un constructeur sans
paramètre.


Je suis pas d'accord.

Utiliser la réflection pour résoudre un problème de design c'est moche.
Comme le dit Vincent Brabant, il suffit de mettre dans la classe abstraite
Matrice une méthode abstraite renvoyant une nouvelle instance de
l'implementation visée : c'est plus rapide, c'est plus propre, les
éventuelles erreurs sont detectées à la compilation, et on peut passer des
paramêtres =)

My 2 Cents.

-- Nicolas Repiquet