Rumah >Java >javaTutorial >Komposisi vs Warisan

Komposisi vs Warisan

DDD
DDDasal
2024-09-25 11:45:44515semak imbas

Composición vs Herencia

pengenalan

Warisan dan gubahan ialah dua konsep asas dalam pengaturcaraan berorientasikan objek (OOP), tetapi ia digunakan secara berbeza dan mempunyai tujuan yang berbeza. Objektif siaran ini adalah untuk menyemak tujuan tersebut dan beberapa perkara yang perlu diingat semasa memilihnya.

Konsep pewarisan

Apabila kita berfikir tentang menerapkan warisan dalam reka bentuk kita, kita perlu memahami:

  • Definisi: Dalam warisan, kelas (dipanggil kelas terbitan atau subkelas) boleh mewarisi sifat dan gelagat daripada kelas lain (dipanggil kelas asas atau superclass). Kelas terbitan boleh memanjangkan atau mengubah suai kefungsian kelas asas.
  • Hubungan: Ia adalah hubungan "adalah" (is-a). Contohnya, jika anda mempunyai kelas "Kenderaan" dan kelas lain "Kereta", kelas "Kereta" ialah subkelas "Kenderaan".
  • Kelebihan: Menggalakkan penggunaan semula kod dan membolehkan pelanjutan fungsi yang mudah.

Konsep gubahan

Sebaliknya, jika kita berfikir tentang mengarang objek antara satu sama lain:

  • Definisi: Dalam gubahan, objek mengandungi objek lain dan mewakilkan sebahagian daripada fungsinya kepada mereka. Daripada warisan, kelas menggunakan tika kelas lain untuk mencapai fungsinya.
  • Hubungan: Ia adalah hubungan "mempunyai" (mempunyai-a). Contohnya, jika anda mempunyai kelas "Enjin" dan kelas "Kereta", kelas "Kereta" boleh mempunyai objek kelas "Enjin".
  • Kelebihan: Fleksibiliti yang lebih baik dan kurang gandingan antara kelas. Perubahan dalam satu kelas tidak menjejaskan kelas yang lain secara langsung.

Mengapa komposisi pada warisan?

Persoalan sama ada komposisi lebih baik daripada warisan atau sebaliknya adalah topik yang diperdebatkan dalam reka bentuk perisian. Kedua-dua pendekatan mempunyai kelebihan dan kekurangan mereka, dan pilihan bergantung pada konteks dan keperluan projek tertentu. Di sini saya akan membentangkan anda satu contoh di mana komposisi boleh menjadi lebih baik daripada warisan.

Mari kita terokai contoh dalam Java yang menggambarkan cara komposisi boleh menjadi lebih baik daripada warisan dalam kes tertentu. Katakan kami sedang mengusahakan sistem pemprosesan pesanan di kedai dalam talian.

  • Pendekatan Warisan:

Pertama, mari kita pertimbangkan pendekatan menggunakan warisan untuk mewakili pelbagai jenis produk yang boleh dibeli, seperti buku dan elektronik:

// Clase base para productos
class Producto {
    String nombre;
    double precio;

    Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    void procesarPedido() {
        System.out.println("Procesando pedido para " + nombre);
    }
}

// Clase para productos electrónicos que hereda de Producto
class ProductoElectronico extends Producto {
    String modelo;

    ProductoElectronico(String nombre, double precio, String modelo) {
        super(nombre, precio);
        this.modelo = modelo;
    }
}

// Clase para libros que hereda de Producto
class Libro extends Producto {
    String autor;

    Libro(String nombre, double precio, String autor) {
        super(nombre, precio);
        this.autor = autor;
    }
}

Pendekatan ini berkesan, tetapi bagaimana jika anda perlu memperkenalkan jenis produk baharu atau menambah fungsi khusus untuk jenis produk tertentu?

  • Fokus dengan Komposisi:

Daripada bergantung sepenuhnya pada warisan, kami boleh menggunakan komposisi untuk mengendalikan pelbagai jenis produk dengan lebih fleksibel:

// Clase para productos
class Producto {
    String nombre;
    double precio;

    Producto(String nombre, double precio) {
        this.nombre = nombre;
        this.precio = precio;
    }

    void procesarPedido() {
        System.out.println("Procesando pedido para " + nombre);
    }
}

// Clase para productos electrónicos que utiliza composición
class ProductoElectronico {
    Producto producto;
    String modelo;

    ProductoElectronico(String nombre, double precio, String modelo) {
        this.producto = new Producto(nombre, precio);
        this.modelo = modelo;
    }

    // Puedes agregar lógica específica para productos electrónicos si es necesario
    void procesarPedidoEspecifico() {
        System.out.println("Procesando pedido específico para " + producto.nombre);
    }
}

// Clase para libros que utiliza composición
class Libro {
    Producto producto;
    String autor;

    Libro(String nombre, double precio, String autor) {
        this.producto = new Producto(nombre, precio);
        this.autor = autor;
    }

    // Puedes agregar lógica específica para libros si es necesario
    void procesarPedidoEspecifico() {
        System.out.println("Procesando pedido específico para " + producto.nombre);
    }
}

Dalam pendekatan ini, setiap jenis produk mempunyai contoh kelas Produk, membenarkan logik biasa dikongsi untuk memproses pesanan. Selain itu, setiap jenis produk boleh mempunyai logik khusus sendiri menggunakan kaedah seperti processSpecificOrder(). Reka bentuk ini lebih fleksibel dan menjadikannya lebih mudah untuk memperkenalkan jenis produk baharu atau mengubah suai logik jenis khusus tanpa menjejaskan hierarki warisan.

Bila hendak memohon warisan?

Walaupun pilihan antara warisan dan komposisi dalam reka bentuk perisian bergantung pada konteks dan keperluan khusus masalah yang anda tangani. Berikut ialah beberapa situasi di mana anda mungkin menganggap warisan sebagai pilihan yang lebih sesuai daripada gubahan:

  • Relación "es-un": La herencia es especialmente adecuada cuando hay una relación clara de "es-un" entre las clases. Si una clase B es una versión más específica o especializada de una clase A, entonces la herencia tiene sentido. Por ejemplo, si tienes una clase Vehiculo y una clase Automovil, la relación "es-un" es clara, ya que un automóvil es un tipo de vehículo.
class Vehiculo {
    // ...
}

class Automovil extends Vehiculo {
    // ...
}
  • Reutilización de código: La herencia permite la reutilización de código, ya que la clase derivada hereda los miembros y métodos de la clase base. Esto puede ser beneficioso cuando hay una cantidad significativa de código común entre las clases relacionadas.
class Animal {
    void comer() {
        // Lógica común para comer
    }
}

class Perro extends Animal {
    void ladrar() {
        // Lógica específica para ladrar
    }
}
  • Polimorfismo: La herencia es fundamental para la implementación del polimorfismo, que permite a las clases derivadas proporcionar implementaciones específicas de los métodos heredados de la clase base. Esto es útil en escenarios donde necesitas tratar objetos de clases derivadas de manera uniforme.
class Figura {
    void dibujar() {
        // Lógica común para dibujar una figura
    }
}

class Circulo extends Figura {
    void dibujar() {
        // Lógica específica para dibujar un círculo
    }
}

class Cuadrado extends Figura {
    void dibujar() {
        // Lógica específica para dibujar un cuadrado
    }
}

  • Extensiones de funcionalidad: Si estás extendiendo o especializando funcionalidad existente, la herencia puede ser más natural. Por ejemplo, si estás desarrollando una biblioteca y proporcionas una clase base con una funcionalidad básica, los usuarios de tu biblioteca pueden derivar de esa clase base para extender esa funcionalidad.

Que pasa si hacemos una mala herencia?

Si seguimos evaluando los pros y los contras de la herencia, uno de los problemas que puede surgir de una mala herencia es que violaríamos el Principio de Segregación de Interfaces, que indica que los clientes no deberían verse obligados a depender de interfaces que no utilizan. Si una interfaz se extiende de manera que incluya métodos que no son relevantes para todas las implementaciones, los clientes que utilizan esa interfaz podrían verse forzados a implementar o depender de métodos que no necesitan, lo que puede llevar a un diseño menos limpio y más difícil de mantener.

Conclusión

En resumen, la herencia se centra en la relación "es un" y se utiliza para modelar jerarquías de clases, mientras que la composición se centra en la relación "tiene un" y se utiliza para construir objetos complejos a partir de otros objetos más simples. Ambos enfoques tienen sus casos de uso específicos y se eligen según la estructura y la naturaleza de las relaciones en el diseño del software.

Atas ialah kandungan terperinci Komposisi vs Warisan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Bab 7 Ujian AkhirArtikel seterusnya:Bab 7 Ujian Akhir