Maison  >  Article  >  Récupère la méthode d'une classe qui étend une autre classe

Récupère la méthode d'une classe qui étend une autre classe

王林
王林avant
2024-02-09 08:40:30506parcourir

En PHP, nous rencontrons souvent des situations où nous devons utiliser une méthode d'une autre classe dans une classe. A ce stade, nous pouvons obtenir ses méthodes en héritant ou en instanciant une autre classe. L'héritage signifie qu'une classe hérite des propriétés et des méthodes d'une autre classe, ce qui est obtenu grâce au mot-clé extends. L'instanciation fait référence à la création d'un objet instance d'une classe et à l'appel de méthodes d'une autre classe via l'objet. Qu'il s'agisse d'héritage ou d'instanciation, nous pouvons facilement obtenir les méthodes d'une autre classe dans une classe, améliorant ainsi la réutilisabilité et la flexibilité du code.

Contenu de la question

J'ai un cours qui prolonge un autre cours. Sur la base de la saisie de l'utilisateur, si « a » est saisi, la classe doit être une sous-classe a, mais si « b » est saisi, la classe sera une sous-classe b. J'ai une variable qui doit être intégrée à la classe principale. Je ne peux pas accéder aux méthodes de la sous-classe car les variables que je définis proviennent de la classe principale. Comment puis-je le faire fonctionner ?

Voici un exemple de décomposition. La variable myclass est utilisée ailleurs, j'ai donc besoin qu'elle soit disponible partout en tant que sous-classe.

public class Programm
{
   private static MainClass myClass;

   public static void main(String args[]) 
   {
      if (input == 'A') {
         myClass = new SubClassA();
         myClass.subClassAMethod(); // Can't do this becuse subClassAMethod isn't in MainClass
      } else {
         myClass = new SubClassB();
         myClass.subClassBMethod(); // Can't do this becuse subClassBMethod isn't in MainClass
      }
   }
}

Je sais que je peux mettre subclassamethod et subclassbmethod dans la classe principale, mais je ne veux pas pouvoir appeler ces méthodes si elles ne font pas partie de la sous-classe.

Existe-t-il un moyen de déclarer ma classe pour accepter à la fois la sous-classe et la sous-classeb ?

Solution de contournement

Cela signifie : variable myclass 存在,并且被限制为指向 null,或者指向类的实例,使得该类是 mainclass ou un sous-type de celle-ci.

De la façon dont

java est configuré, java refusera simplement de compiler toute interaction avec cette variable à moins que cela ait du sens dans tous les scénarios possibles . p>

En d'autres termes, même si vous pouviez prouver hors de tout doute raisonnable qu'à un moment donné du flux de votre code, cette variable doit pointer vers une instance de mysubclassb , le compilateur ne s'en soucierait pas.

Votre style de codage est discutable. Ce n'est pas votre méthode Java.

Notez que myclass en tant que nom de variable crie simplement "Je ne comprends pas comment cela fonctionne". C'est très trompeur : les variables ne peuvent faire référence qu'à des instances, pas à des classes.

En passant, static 在您的代码片段中被滥用。静态对于大多数java项目来说通常不是必需的,也是一个比较高级的概念。如果您不想了解其具体含义,也没关系。但你一定不能使用它。 main 目前必须是静态的(很快从 jdk22+ 开始就不必是静态的),所以解决方案是立即摆脱 static .

Voici un exemple de la façon de procéder. Ces extraits de code tentent de rendre les choses plus claires en utilisant de meilleurs noms pour les types et les variables :

class animal {}
class cat extends animal {
  void meow() {}
}
class dog extends animal {
  void howl() {}
}

class main {
  public static void main(string[] args) {
    new main().go();
  }

  void go() {
    example1('a');
  }

  private animal animal;

  void example1(char input) {
    if (input == 'a') {
      var cat = new cat();
      animal = cat;
      cat.meow();
    } else {
      var dog = new dog();
      animal = dog;
      dog.howl();
    }
  }
}

Si le code new subclassa() et le code myobject.subclassamethod() ne sont pas proches, alors cela ne fonctionnera pas. Vous devez utiliser instanceof pour vérifier si new subclassa() 和代码 myobject.subclassamethod() 不靠近,那么这将不起作用。您必须使用 instanceof 来检查 myclass (encore une fois, très mauvais nom) est le type correct. On dirait :

// as part of Main.java snippet as above:
public void tryToHowl() {
  if (animal instanceof Dog dog) dog.howl();
}

Cela vérifie animal 是否指向 dog 实例或 dog 类型的某个子类型的对象。如果不是,则 if 不会按照您的预期执行任何操作(animal 不是 dog 的实例,因此 if 不会执行其内容)。如果是,则创建一个新变量 dog dog 指向它,输入 dog afin que vous puissiez y appeler des méthodes réservées aux chiens.

Veuillez noter que généralement l'utilisation de instanceof signifie que votre code n'est pas configuré correctement. L'intérêt d'avoir la variable animal animal est qu'elle peut contenir instanceof 意味着您的代码设置错误。拥有变量 animal animal 的全部意义在于它可以包含任何动物 - 如果您的代码实际上需要它是一只狗,那么它应该是 dog dog。或者,您应该有一个该代码的子类,一个专门针对 dogs 的版本,其中有一个定义为 dog dog 的字段。如果它是一个对多种对象的细节进行编码的方法(if(猫猫的动物实例)docatthing(); else if(狗狗的动物实例)dodogthing();等的大列表),那么应该实际上是 animal 类中的一个抽象方法,animal 的每个实现都提供一个实现:带有 class dogn'importe quel animal

- si votre code a réellement besoin que ce soit un chien, alors ce devrait être chien chien . Alternativement, vous devriez avoir une sous-classe de ce code, une version spécifiquement pour les chiens qui a un champ défini comme chien chien. S'il s'agit d'une méthode qui encode les détails de plusieurs objets (if (instance animale de chat) docatthing(); sinon if (instance animale de chien) dodogthing(); etc. list), alors elle devrait en fait être une méthode abstraite dans la classe animal, chaque implémentation de animal fournissant une implémentation : avec class dog > contiendra le dog- code spécifique car c'est là que réside le code spécifique au chien.

instanceof,因此,如果你确实使用 instanceofQuoi qu'il en soit, vous n'avez pas besoin de instanceof, donc si vous

do 🎜 utilisez instanceof, surtout si les débutants le font, plus de 95 % du temps en termes de style de code très mauvaise façon de procéder. "Mauvais" signifie : difficile à comprendre, rigide (les changements futurs dans les exigences du code sont quelque chose que tous les projets non académiques traversent toujours, nécessitant plus d'efforts que vous ne le pensez), difficile à intégrer dans les bibliothèques existantes, souvent Java non spécifique à une classe, qui n'est pas ce que font la plupart des programmeurs Java de la planète, compliquant ainsi inutilement la courbe d'apprentissage et de compréhension de ce code. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer