Question sur la POO : empêcher l'héritage d'une fonction public ?

WRInaute passionné
Question sur la POO : empêcher l'héritage d'une fonction pub

Bonjour,

Est-il possible d'empêcher l'héritage d'une fonction à une classe fille... tout en gardant l'accès public par l'instanciation de la classe mère.

Exemple.

Code:
class A {
     public function test() {
     }
}


class B extends A {
     
}
Je veux pouvoir accéder $oA->test();
Mais pas à $oB->test();

En gros j'aurais besoin d'un mot clé tel que inherited.
Est-ce que cette notion existe dans la programmation objet (en PHP et ailleurs) ?
Est-ce qu'il y a des solutions pour simuler cette notion ?

Merci.
 
WRInaute passionné
Hello,

en PHP il me semble que c'est le mot clé "final" qui sert à ça.

Edit : quoi que non, elle empêche la surcharge, pas l'appel.

En même temps si tu veux vraiment bloquer l'appel je pense que tu peux surcharger par une méthode private/protected. Mais... es tu sûr que ton héritage soit "justifié" en fait ?
 
WRInaute passionné
Bool a dit:
en PHP il me semble que c'est le mot clé "final" qui sert à ça.

Edit : quoi que non, elle empêche la surcharge, pas l'appel.
J'ai eu la même réflexion :)


Bool a dit:
En même temps si tu veux vraiment bloquer l'appel je pense que tu peux surcharger par une méthode private/protected.
Intéressant je vais tester ça après avoir mangé rien que par curiosité même si c'est contraignant.


Bool a dit:
Mais... es tu sûr que ton héritage soit "justifié" en fait ?
A première vue oui.


Merci, je posterai le résultat du private même si je ne pense pas adopter cette solution.
 
Nouveau WRInaute
En java il y a effectivement final mais qui n'empêche pas l'utilisation.

Cependant il y a les interface pour faire ça :

si tu as
Code:
public class A implements AInterface {

	public void MethodeVisibleDansA() {
		
	}

	public void MethodeToujoursVisible() {
	}
	
}


public class B implements BInterface {
	
}

public interface CommonInterface {
	
	public void MethodeToujoursVisible();
	
	
}


public interface AInterface extends CommonInterface {
	public void MethodeVisibleDansA();
}

public interface BInterface extends CommonInterface {
	
}

Et que tu n'utilises que des interfaces, tu auras ce que tu veux. Je ne critiquerai pas l'approche. C'est sans doute un problème de conception derrière...

pense aussi à la composition sans rendra peut être ton problème plus simple




[/quote][/code]
 
WRInaute occasionnel
sinon tu peux regarder de quelle classe "this" est il instance dans l'implementation dans A.
Si pas instance de A (ne pas utiliser instanceof mais par exemple get_class() en php) alors return false
 
Discussions similaires
Haut