Saat ini saya memiliki dua kelas turunan, A
dan B
, keduanya memiliki bidang yang sama dan saya mencoba untuk menentukan apakah harus naik ke kelas dasar.
Itu tidak pernah direferensikan dari kelas dasar, dan mengatakan jika di beberapa titik jalan kelas lain diturunkan C
,, yang tidak memiliki _field1
, maka tidak akan kepala sekolah "paling istimewa" (atau sesuatu) dilanggar jika dulu?
public abstract class Base
{
// Should _field1 be brought up to Base?
//protected int Field1 { get; set; }
}
public class A : Base
{
private int _field1;
}
public class B : Base
{
private int _field1;
}
public class C : Base
{
// Doesn't have/reference _field1
}
object-oriented
inheritance
abstract-class
Sam adalah
sumber
sumber
Base
,A
,B
,C
, dan_field1
adalah. Itu adalah detail penting yang tidak boleh diabaikan; Saya pikir Anda harus mengedit pertanyaan untuk berbicara tentang apa itu.Jawaban:
Itu semua tergantung pada masalah yang Anda coba selesaikan.
Pertimbangkan contoh konkret: kelas dasar abstrak
Vehicle
Anda dan Anda saat ini memiliki implementasi konkretBicycle
danCar
. Anda sedang mempertimbangkan untuk pindahnumberOfWheels
dariBicycle
danCar
ke kendaraan. Haruskah kamu melakukan ini? Tidak! Karena tidak semua kendaraan memiliki roda. Anda sudah bisa mengatakan bahwa jika Anda mencoba menambahkanBoat
kelas maka itu akan rusak.Sekarang, jika kelas dasar abstrak Anda
WheeledVehicle
maka logis untuk memilikinumberOfWheels
variabel anggota di sana.Anda perlu menerapkan logika yang sama untuk masalah Anda, karena seperti yang Anda lihat, itu bukan jawaban ya atau tidak yang sederhana.
sumber
roll()
metode, di mana ide subclass terlihat sudah bagus.Secara logis, selain menempatkan bidang yang direplikasi dalam subclass vs yang sama di kelas dasar, ada opsi ketiga: yaitu untuk memperkenalkan subclass baru ke dalam hierarki yang memiliki properti umum di antara keduanya. @Pete mengisyaratkan hal ini tanpa sepenuhnya pergi ke sana.
Menggunakan contoh @ Pete, kami akan memperkenalkan subkelas (mungkin abstrak) untuk Kendaraan Beroda yang diturunkan dari kelas dasar asli - sementara dua subkelas turun darinya. Dengan demikian, kelas dasar asli tidak tercemar dengan roda, namun kesamaan roda adalah KERING (tidak diulangi di antara subkelas yang memiliki roda).
Ini mungkin, tentu saja, berlebihan untuk tujuan Anda, tetapi itu didukung oleh mekanisme hierarki kelas.
sumber
Saya akan berperan sebagai penasihat iblis di sini.
Saat ini kamu seharusnya tidak melakukan apa - apa .
Apakah KERING? Tidak. Tetapi lebih baik memiliki duplikasi kecil daripada abstraksi prematur yang tidak bisa Anda tolak dengan mudah nanti. Refactor untuk memindahkan properti ke kelas dasar umum mudah. Pergi ke arah lain tidak. Tunggu dan lihat.
Ketika membuat keputusan semacam ini, saya cenderung menggunakan "aturan 3": begitu saya mengulangi hal yang sama di misalnya tiga tempat yang berbeda, dan hanya kemudian, saya mempertimbangkan untuk memindahkannya ke atas rantai. NB Anda hanya di 2.
sumber
Secara umum, saya akan memindahkannya ke kelas dasar. Saya tidak berpikir ada tujuan ya / tidak, karena ada pertukaran di sini - membawa bidang yang tidak digunakan vs mengurangi kompleksitas.
Saya biasanya lebih suka kelas dasar 'berat' yang berisi apa pun yang mungkin dibagikan. Ini membuat serialisasi ke file lebih mudah karena Anda tidak perlu metode serialisasi turunan di setiap kelas turunan. Tetapi jika Anda tidak memiliki itu atau masalah serupa, atau mungkin Anda perlu melakukan semua yang Anda bisa untuk mengurangi penggunaan memori, maka hanya menjaga bidang di mana Anda membutuhkannya harus baik-baik saja.
Kelas 'perantara' yang memperkenalkan bidang umum akan baik-baik saja jika Anda memiliki jumlah bidang yang sangat terbatas. Namun ketahuilah bahwa pendekatan dapat secara dramatis meningkatkan kompleksitas jika Anda memiliki lusinan bidang yang digunakan dalam kombinasi yang berbeda, yang mengarah ke banyak kelas perantara yang masing-masing memperkenalkan kumpulan bidang tertentu. Itu bisa menjadi masalah pemeliharaan.
sumber