Saya memiliki kelas dasar abstrak dan saya ingin mendeklarasikan bidang atau properti yang akan memiliki nilai berbeda di setiap kelas yang diwarisi dari kelas induk ini.
Saya ingin mendefinisikannya dalam baseclass sehingga saya dapat merujuknya dalam metode kelas dasar - misalnya menimpa ToString untuk mengatakan "Objek ini adalah tipe properti / bidang ". Saya punya tiga cara yang bisa saya lihat untuk melakukan ini, tetapi saya bertanya-tanya - apa cara terbaik atau diterima untuk melakukan ini? Pertanyaan pemula, maaf.
Opsi 1:
Gunakan Properti abstrak dan menimpanya di kelas yang diwarisi. Ini manfaat dari ditegakkan (Anda harus menimpanya) dan bersih. Tapi, rasanya sedikit salah untuk mengembalikan nilai kode keras daripada merangkum bidang dan itu adalah beberapa baris kode, bukan hanya. Saya juga harus mendeklarasikan badan untuk "mengatur" tetapi itu kurang penting (dan mungkin ada cara untuk menghindari apa yang saya tidak sadari).
abstract class Father
{
abstract public int MyInt { get; set;}
}
class Son : Father
{
public override int MyInt
{
get { return 1; }
set { }
}
}
Opsi 2
Saya bisa mendeklarasikan bidang publik (atau bidang yang dilindungi) dan secara eksplisit menimpanya di kelas yang diwarisi. Contoh di bawah ini akan memberi saya peringatan untuk menggunakan "baru" dan saya mungkin bisa melakukan itu, tetapi rasanya salah dan itu merusak polimorfisme, yang merupakan intinya. Sepertinya bukan ide yang bagus ...
abstract class Mother
{
public int MyInt = 0;
}
class Daughter : Mother
{
public int MyInt = 1;
}
Opsi 3
Saya bisa menggunakan bidang yang dilindungi dan menetapkan nilai dalam konstruktor. Ini tampaknya cukup rapi tetapi bergantung pada saya untuk memastikan konstruktor selalu menetapkan ini dan dengan beberapa konstruktor kelebihan beban selalu ada kesempatan beberapa jalur kode tidak akan menetapkan nilai.
abstract class Aunt
{
protected int MyInt;
}
class Niece : Aunt
{
public Niece()
{
MyInt = 1;
}
}
Ini sedikit pertanyaan teoretis dan saya kira jawabannya harus menjadi opsi 1 karena ini adalah satu-satunya pilihan yang aman, tetapi saya hanya ingin memahami C # dan ingin menanyakan hal ini kepada orang-orang dengan pengalaman lebih.