Rumah  >  Artikel  >  Bila hendak menggunakan abstraksi dan bila hendak menggunakan antara muka?

Bila hendak menggunakan abstraksi dan bila hendak menggunakan antara muka?

PHPz
PHPzke hadapan
2024-02-22 12:25:19700semak imbas

Editor PHP Zimo membawa anda meneroka masa penggunaan kelas abstrak dan antara muka dalam Java. Dalam pengaturcaraan Java, memilih masa untuk menggunakan kelas abstrak dan masa untuk menggunakan antara muka adalah keputusan penting. Artikel ini akan menjawab soalan biasa ini untuk anda dan membantu anda memahami dengan lebih baik cara memilih kelas atau antara muka abstrak yang sesuai dalam situasi yang berbeza.

Kandungan soalan

Saya samar-samar memahami perbezaan antara abstraksi dan antara muka, tetapi apa yang saya tidak faham ialah bila hendak menggunakan abstraksi dan bila hendak menggunakan antara muka. Apakah pembolehubah yang saya perlukan untuk memilih abstraksi antara muka dan sebaliknya? Kebanyakan jawapan dalam talian bertujuan untuk menunjukkan perbezaan, tetapi saya juga memahaminya. Saya tidak tahu bila lebih sesuai.

Penyelesaian

Peraturan lama umum ialah: kekalkan antara muka sehingga anda terpaksa menulis kelas abstrak.

Jenis yang tidak boleh serta-merta dalam java mentakrifkan antara muka awam yang jenis lain boleh interface pilih untuk dipatuhi.

    Antara muka boleh mengisytiharkan kaedah awam, yang mesti ditakrifkan oleh pelaksananya. Semua kaedah tersebut adalah secara tersirat
  • . abstract,因此您不需要使用单词 abstract
  • Dalam versi java yang lebih lama, antara muka tidak boleh mempunyai pelaksanaan lalai, jadi setiap kaedah sedang
  • menggunakan pelaksanaan lalai yang digunakan dalam kelas melainkan diganti. abstract。现在情况已不再是这样,接口现在可以具有在 implement
  • Dalam versi java terkini, antara muka boleh mengisytiharkan
  • kaedah pembantu. Ini boleh membantu dengan pelaksanaan lalai. private
  • Antara muka tidak boleh mempunyai pembina atau pembolehubah contoh.
  • Sesebuah kelas boleh
  • mempunyai berbilang antara muka. implement
  • Kaedah

, walaupun anda biasanya mahu melakukan ini. abstract 类 只是一个无法实例化的类。抽象类不需要定义任何 abstract

    Kelas abstrak boleh mengisytiharkan kaedah dengan apa-apa keterlihatan: awam,
  • , dilindungi dan pakej-peribadi. publicprivateprotected
  • Kelas abstrak boleh melaksanakan kaedah atau mengekalkannya sebagai abstrak. Kaedah dalam kelas abstrak
  • bukan abstract。抽象类中的方法不是隐式 abstract secara tersirat abstrak dan mesti ditandakan sedemikian.
  • Kelas abstrak boleh mempunyai pembina,extending 类必须使用 superpanggil pembina dalam pembina mereka sendiri. Kelas abstrak boleh mempunyai pembolehubah contoh sebarang keterlihatan dan ia berfungsi sama seperti pembolehubah contoh dalam mana-mana kelas induk.
  • Kesempurnaan kelas tidak mengubah bilangan kelas super yang dibenarkan untuk dimiliki. extend 一个类,可以是 abstract 类,也可以是具体类。类的 abstract

) untuk berkomunikasi dengan tingkap serta keseluruhan api hayunan. abstract classes 应该是例外而不是常态。如果您需要维护某些内部状态,同时还让子类定义您自己的行为,则应该使用抽象类。一个很好的例子来自 java swing gui 库:AbstractButtonabstractbutton 是行为模糊地类似于窗口中按钮的事物的抽象父代,包括按钮、切换按钮和菜单中的项目。任何人都可以子类化 abstractbutton 并实现其成员来定义类似按钮的显示。但是 abstractbutton 还必须维护大量内部状态(其中大部分来自 jcomponent

Jika anda ingin menentukan antara muka awam untuk koleksi jenis, gunakan

. Jika anda ingin menyediakan pelaksanaan lalai untuk beberapa kaedah ini dan menggunakan versi java yang dikeluarkan selepas 2014, gunakan antara muka. Jika anda memerlukan pelaksanaan lalai tetapi masih tersekat pada tahun 2000-an, gunakan kelas abstrak. Tidak kira versi java, jika anda memerlukan keadaan persendirian (seperti pembolehubah contoh) atau permulaan tersuai (seperti pembina), gunakan kelas abstrak. interface

Antaramuka:

Andaikan anda mempunyai antara muka seperti:

interface animal {
  string makenoise();
}

Dan beberapa kelas yang melaksanakan haiwan:

class cat implements animal {
    string makenoise() {
        return "meow";
    }
}

class dog implements animal {
    string makenoise() {
        return "woof";
    }
}

Kini anda boleh menggunakan antara muka sebagai jenis pulangan, jadi kaedah boleh kembali

. catdog

string makeanimalmakenoise(int animalid) {
    animal animal = pretendanimalservice.getdogorcat(animalid);

    animal.makenoise();
}

Kelas abstrak:

Andaikan anda mempunyai kelas abstrak:

abstract class animal {
    public string makenoise() {
        return "whistle";
    }

    abstract public string getname();
}

Kini, mana-mana kelas yang melanjutkannya perlu melaksanakan kaedah

: getname

class Cat extends Animal {
    String getName() {
        return "Pussy";
    }
}

class Dog extends Animal {
    String getName() {
        return "Fido";
    }
}

Kedua-dua kelas di atas melaksanakan kaedah

yang diperlukan, tetapi mereka juga mempunyai akses kepada kaedah makenoise kelas induk, yang juga boleh ditindih jika perlu. getname 方法,但它们也可以访问父类 makenoise

Perbezaan lain juga perlu diperhatikan, iaitu:

    Anda hanya boleh melanjutkan satu kelas abstrak, tetapi anda boleh melaksanakan berbilang antara muka.
  • Antara muka harus digunakan apabila jenis yang berbeza harus mempunyai tandatangan kaedah yang sama, dan kelas abstrak harus digunakan apabila pelaksanaan berkongsi gelagat yang sama.
  • Mereka tidak saling eksklusif.
  • Antara muka hanya boleh mempunyai kaedah awam, manakala kelas abstrak boleh mempunyai kaedah awam dan kaedah yang dilindungi.

Atas ialah kandungan terperinci Bila hendak menggunakan abstraksi dan bila hendak menggunakan antara muka?. 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
Artikel sebelumnya:Pustaka Java menggunakan javafxArtikel seterusnya:Pustaka Java menggunakan javafx