Java: “Class Surcharge”
D'accord, alors disons que j'ai un fichier de classe appelé Orange, puis deux fichiers de classe appelé Couleur, et des Fruits.
À l'intérieur de l'Orange, il y a certaines propriétés de la couleur, la taille, la maturité etc. et la méthode setSize(int taille).
À l'intérieur des Fruits, il y a certaines propriétés pour le nom, le type de fruit, si oui ou non il a des graines, où il a été importé à partir de etc. et puis les méthodes setName(String name), à manger(), lavage() et donner(Personne personne).
À l'intérieur de la Couleur il y a quelques propriétés pour le nom, les valeurs RGB, Hex valeurs, les valeurs Alpha etc. et puis les méthodes setName(), setAlpha(int alpha), setRGB(int r, int g, int b) et setHex(int hex).
La plupart des informations mentionnées ci-dessus n'est pas pertinent, et uniquement là pour vous aider à comprendre.
L'Orange fichier de Classe est un objet appelé "Parent". Ce que j'ai besoin de savoir c'est, est-il possible de l'objet "Parent" pour être soit un Fruit, ou une Couleur? Plus tard dans la classe principale de fichier, il arrive un point où myOrange.Parent.setName("Bob") qui se passe, et dans les deux cas (si le Parent est un Fruit ou une Couleur), il serait possible, parce que le Fruit a une méthode setName, et des Couleurs ainsi.
Grâce
Avez-vous essayé d'écrire cela en Java et de le compiler? Ce type devrait le membre parent, de sorte que vous pouvez attribuer un Fruit instance ou une Couleur d'instance?
donc ce qui arrive quand une orange (fruit) a une couleur orange?
OriginalL'auteur Blackvein | 2012-02-16
Vous devez vous connecter pour publier un commentaire.
Héritage de Type ("class surcharge"?) représente un "est-un" de la relation.
L'Orange est un Fruit. Aucune des variables supplémentaires sont nécessaires; les membres hérités sont accessibles via
this
.Composition représente un "a-un" de la relation.
Le Orange est une Couleur. Une variable distincte est déclarée lors de l'utilisation de ce modèle, donc c'est clairement ce qui est utilisé pour
Parent
.Ainsi
Parent
(une horrible variable nommée) est une instance de la Couleur.OriginalL'auteur Joe Coder
Cela dépend vraiment de votre cas d'utilisation. Si le "Orange" classe représente la couleur orange, alors il peut faire sens pour elle hérite de la "Couleur" de la classe. Si elle représente le fruit, alors il peut faire sens pour hériter de la "Fruit" de la classe.
Cependant, dans les deux cas (au moins à l'information donnée) puis-je voir une raison pour les "Orange" classe d'avoir un "Parent" de référence. Il aurait plus de sens (encore une fois, selon votre cas d'utilisation) pour votre "Orange" de la classe d'étendre ce soit la Couleur ou de Fruits, comme je l'ai dit avant.
OriginalL'auteur mWillis
Si par "
parent
" tu veux dire "inherits from
", alors la réponse est non.Orange
peut hériter deFruit
mais pas deColor
. L'héritage doit être un "est-un" de la relation.Un
Orange
"est-un"Fruit
, c'est correct.Un
Orange
"est-un"Color
mmmm ne sonne pas bon.OriginalL'auteur GETah
Ce que vous pouvez faire est de Couleur Orange et mettre en œuvre une interface nommée " soit "NameHolder" (si vous souhaitez exposer à la fois un getter et un setter) ou "NameSetter" (si vous voulez juste pour exposer le setter).
Comme cela (je vais utiliser NameHolder comme le cas le plus fréquent):
Dans ce mode, l'Orange peut tenir sa "mère" de l'Objet et non pas comme un Objet (qui a très peu de comportement), mais comme une instance d'un NameHolder. Cela rend la ligne que vous l'avez souligné:
Cette ligne permettra de compiler sans erreur (bien sûr, il en résultera une NullPointerException lors de l'exécution si le Parent est null). Je dois également souligner que Java le codage de lignes directrices recommandent que les champs minuscules, de sorte qu'il doit être conforme à la convention:
OriginalL'auteur MetroidFan2002
Dans un statiquement typé langage comme Java vous ne peut pas appeler une méthode sur une variable, à moins que le type de la variable déclare ladite méthode. Le type de la variable limite votre accès aux objets de la variable de points; c'est comme une fenêtre qui vous permet de voir une partie seulement de l'objet qui se trouve derrière elle.
Ce qui est différent de typées dynamiquement langues; il y a le type de variable n'est pas de restreindre l'accès à l'objet. Tant que l'objet est la méthode que vous appelez, vous êtes bon pour aller.
Donc en Java, vous devez:
setName
méthode. Le moyen le plus souple pour ce faire est par la création d'uninterface
. Ensuite, vousimplement
" de l'interface dans les classes qui en fait unsetName
méthode, etparent
.Par exemple:
OriginalL'auteur Joni
Si Orange a fait un parent via l'héritage, il doit déjà y avoir accès à ses fonctions de membre. Il semble que vous essayez d'obtenir le Orange pour hériter de la Couleur et de Fruits en même temps à travers une solution de contournement car Java ne supporte pas l'héritage multiple. Ce n'est probablement pas ce que vous voulez vraiment faire. Votre meilleur pari est de mettre en place une bonne relation qui a déjà été fait allusion.
De cette façon, l'Orange est un Fruit et a une Couleur. Si vous voulez d'Orange pour avoir la capacité d'ÊTRE un Fruit OU une Couleur, vous avez besoin de repenser ce que vous voulez. Il est toujours possible d'avoir un Fruit avec nom="Orange" et une Couleur nom="Orange" sans faire réellement de la même classe.
OriginalL'auteur Thomas
Si vous souhaitez programmer de cette façon, vous pouvez vérifier avant l'exécution d'une méthode pour voir si "Parent" fait référence à une instance de Fruits ou de Couleur, puis exécuter la méthode d'appel.
OriginalL'auteur Martin