Rumah  >  Artikel  >  Dapatkan kaedah daripada kelas yang memanjangkan kelas lain

Dapatkan kaedah daripada kelas yang memanjangkan kelas lain

王林
王林ke hadapan
2024-02-09 08:40:30554semak imbas

Dalam PHP, kita sering menghadapi situasi di mana kita perlu menggunakan kaedah kelas lain dalam satu kelas. Pada masa ini, kita boleh mendapatkan kaedahnya dengan mewarisi atau membuat instantiating kelas lain. Warisan bermakna satu kelas mewarisi sifat dan kaedah daripada kelas lain, yang dicapai melalui kata kunci lanjutan. Instantiation merujuk kepada mencipta objek contoh kelas dan kaedah memanggil kelas lain melalui objek. Sama ada pewarisan atau instantiasi, kita boleh mendapatkan kaedah kelas lain dengan mudah dalam satu kelas, meningkatkan kebolehgunaan semula dan fleksibiliti kod.

Isi soalan

Saya ada kelas yang melanjutkan kelas lain. Berdasarkan input pengguna, jika "a" dimasukkan, kelas perlu menjadi subkelas a, tetapi jika "b" dimasukkan, kelas akan menjadi subkelas b. Saya mempunyai pembolehubah yang perlu dijadikan kelas utama. Saya tidak boleh mengakses kaedah subkelas kerana pembolehubah yang saya tentukan adalah daripada kelas utama. Bagaimanakah saya boleh membuatnya berfungsi?

Berikut adalah contoh penguraian. Pembolehubah myclass digunakan di tempat lain, jadi saya memerlukannya untuk tersedia sebagai subkelas di mana-mana sahaja.

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
      }
   }
}

Saya tahu saya boleh meletakkan subclassamethod dan subclassbmethod dalam kelas utama, tetapi saya tidak mahu dapat memanggil kaedah ini jika ia bukan sebahagian daripada subclass.

Adakah terdapat cara untuk membuat myclass diisytiharkan untuk menerima kedua-dua subclassa dan subclassb?

Penyelesaian

Ini bermakna: pembolehubah myclass 存在,并且被限制为指向 null,或者指向类的实例,使得该类是 mainclass atau beberapa subjenis daripadanya.

Cara

java disediakan, java hanya akan menolak untuk menyusun sebarang interaksi dengan pembolehubah ini melainkan ia masuk akal dalam semua senario yang mungkin . p>

Dalam erti kata lain, walaupun anda boleh membuktikan tanpa keraguan munasabah bahawa pada satu ketika dalam aliran kod anda pembolehubah itu mesti menunjuk kepada contoh mysubclassb , pengkompil tidak akan mengambil berat tentang perkara itu.

Gaya pengekodan anda dipersoalkan. Ini bukan cara java anda.

Perhatikan bahawa myclass sebagai nama berubah-ubah hanya menjerit "Saya tidak faham bagaimana ini berfungsi". Ini sangat mengelirukan: pembolehubah hanya boleh merujuk kepada contoh, bukan kelas.

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

Berikut ialah contoh cara melakukan ini. Coretan kod ini cuba membuat perkara lebih jelas dengan menggunakan nama yang lebih baik untuk jenis dan pembolehubah:

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();
    }
  }
}

Jika kod new subclassa() dan kod myobject.subclassamethod() tidak rapat, maka ini tidak akan berfungsi. Anda perlu menggunakan instanceof untuk menyemak sama ada new subclassa() 和代码 myobject.subclassamethod() 不靠近,那么这将不起作用。您必须使用 instanceof 来检查 myclass (sekali lagi, nama yang sangat buruk) adalah jenis yang betul. Nampak seperti:

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

Ini menyemak animal 是否指向 dog 实例或 dog 类型的某个子类型的对象。如果不是,则 if 不会按照您的预期执行任何操作(animal 不是 dog 的实例,因此 if 不会执行其内容)。如果是,则创建一个新变量 dog dog 指向它,输入 dog supaya anda boleh memanggil kaedah anjing sahaja padanya.

Sila ambil perhatian bahawa biasanya menggunakan instanceof bermakna kod anda disediakan dengan salah. Perkara utama untuk mempunyai haiwan haiwan pembolehubah ialah ia boleh mengandungi instanceof 意味着您的代码设置错误。拥有变量 animal animal 的全部意义在于它可以包含任何动物 - 如果您的代码实际上需要它是一只狗,那么它应该是 dog dog。或者,您应该有一个该代码的子类,一个专门针对 dogs 的版本,其中有一个定义为 dog dog 的字段。如果它是一个对多种对象的细节进行编码的方法(if(猫猫的动物实例)docatthing(); else if(狗狗的动物实例)dodogthing();等的大列表),那么应该实际上是 animal 类中的一个抽象方法,animal 的每个实现都提供一个实现:带有 class dogsebarang haiwan

- jika kod anda benar-benar memerlukannya untuk menjadi anjing, maka ia mestilah anjing anjing . Sebagai alternatif, anda harus mempunyai subkelas kod itu, versi khusus untuk anjing yang mempunyai medan yang ditakrifkan sebagai anjing anjing. Jika ia merupakan kaedah yang mengekodkan butiran berbilang objek (if (animal instance of cat) docatthing(); else if (animal instance of dog) dodogthing(); etc. list), maka ia sepatutnya menjadi kaedah abstrak dalam kelas haiwan, dengan setiap pelaksanaan haiwan menyediakan pelaksanaan: dengan class dog > akan mengandungi anjing- kod khusus kerana di situlah tempat tinggal kod khusus anjing.

instanceof,因此,如果你确实使用 instanceofBagaimanapun, anda tidak memerlukan instanceof, jadi jika anda

melakukan 🎜 menggunakan instanceof, terutamanya jika pemula melakukannya, maka 95%+ Gaya kod sangat teruk cara untuk melakukannya. "Bad" bermaksud: sukar difahami, tidak fleksibel (perubahan masa depan dalam keperluan kod adalah sesuatu yang selalu dilalui oleh semua projek bukan akademik, memerlukan lebih banyak usaha daripada yang anda fikirkan), sukar untuk disepadukan ke dalam perpustakaan sedia ada, selalunya bukan java khusus kelas, yang adalah - bukan apa yang kebanyakan pengaturcara java di planet ini lakukan, dengan itu tidak perlu merumitkan pembelajaran dan keluk pemahaman kod ini. 🎜

Atas ialah kandungan terperinci Dapatkan kaedah daripada kelas yang memanjangkan kelas lain. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam