Desain Java: Menambahkan fungsionalitas umum ke kelas yang memperluas kelas dasar yang sama, tanpa mengubah kelas dasar

Saya mencoba mencari cara terbaik untuk menyelesaikan masalah ini dalam proyek yang sedang saya kerjakan. Saya akan memberikan analogi masalahnya:

Ada kelas, Mobil. Dari Mobil, saya membuat 3 kelas yang memperluasnya:

  • Limo memperluas Mobil
  • Truk memperluas Mobil
  • Bus memperluas Mobil

Sekarang, katakanlah saya menyadari bahwa seseorang lupa memasukkan metode getSpeed() ke kelas Mobil, dan saya perlu menambahkannya. Namun, Saya tidak dapat memodifikasi kelas Mobil dengan cara apa pun, dan 3 kelas tersebut harus memperluas Mobil. Bagaimana cara terbaik untuk menambahkan fungsi umum ke 3 kelas ini tanpa harus menyalin kode tempel bolak-balik? Implementasi metode getSpeed() sama untuk setiap kelas, jadi saya ingin sesuatu seperti kelas abstrak, namun tetap dapat mempertahankan kelas tersebut sebagai perluasan Car.

Ini adalah contoh satu-satunya cara saya mengatasinya sejauh ini, tetapi saya ingin tahu apakah ada cara yang lebih baik:

public class Limo extends Car {
    CarSpeed cs;
    public Limo() {
        cs = new CarSpeed(this);
    }
}

dan membuat kelas CarSpeed berisi metode getSpeed() yang sebenarnya.

Apakah ada cara yang lebih bersih untuk melakukan ini yang tidak saya sadari? Saya juga hanya bisa bekerja di Java 7, jadi saya rasa saya tidak bisa menggunakan kata kunci default (bukan berarti saya sudah cukup membacanya untuk mengetahui apakah itu berlaku untuk situasi ini :( )


person rococo    schedule 16.02.2016    source sumber
comment
Bolehkah saya bertanya mengapa Anda tidak dapat menambahkan getSpeed() ke Mobil? Inti dari pewarisan adalah untuk mengadopsi fitur-fitur tertentu dari kelas induk/dasar.   -  person ryekayo    schedule 17.02.2016
comment
Itu bagian dari file jar yang tidak dapat saya kompilasi ulang dengan mudah :(   -  person rococo    schedule 17.02.2016
comment
Astaga. Hmmm.... jadi pada dasarnya Anda mengimpor perpustakaan, benar?   -  person ryekayo    schedule 17.02.2016
comment
Benar, pada dasarnya saya dapat melihat sumber Mobil tetapi tidak dapat menggunakan versi modifikasi tanpa banyak masalah.   -  person rococo    schedule 17.02.2016
comment
Oke, saya benci mengatakannya dan saya tahu Anda tidak ingin menyalin/menempel tetapi mungkin menggunakan antarmuka bukanlah solusi yang buruk   -  person ryekayo    schedule 17.02.2016


Jawaban (1)


Ada dua cara yang mungkin untuk mencapai hal ini:

  1. Tambahkan getSpeed() ke kelas Mobil sehingga kelas lain bisa mewarisi metode ini. Ini mungkin cara terbaik karena mengikuti OOP.

  2. Buat antarmuka dan tambahkan getSpeed() ke dalamnya. Satu-satunya hal adalah kelas lain seperti Limo, Truk, dan Bus harus membuat badan getSpeed() saat Anda mengimplementasikan antarmuka.

person ryekayo    schedule 16.02.2016