Dalam kode sistem asli perusahaan, saya melihat banyak kode yang membedakan atribut ClassName dari objek yang diskriminatif diproses secara terpisah. Dan tampaknya menjadi cara standar untuk mengatasi masalah yang sama. Tetapi mungkin ada beberapa masalah.
Pertama-tama, kita tahu bahwa polimorfisme adalah salah satu dari tiga fitur utama yang berorientasi pada objek. Yang disebut polimorfisme adalah bahwa untuk jenis konkret yang berbeda, kita dapat mengaksesnya melalui antarmuka abstrak yang sama tanpa harus berhubungan dengan detail implementasi jenis konkret. Sama seperti mengeluarkan pemberitahuan: semua karyawan berkumpul di Lapangan People pada jam 9 besok. Tidak perlu untuk secara khusus memberi tahu setiap orang yang tinggal di lokasi yang berbeda tentang jam berapa untuk ditetapkan dan rute apa yang harus diambil, karena ini adalah tanggung jawab orang tertentu, bukan tanggung jawab orang yang memberi tahu penerbit. Oleh karena itu, ketika menulis untuk menentukan bahwa ClassName perlu diproses secara terpisah, cara pertama untuk dipikirkan adalah dengan menambahkan antarmuka ke kelas induk dan menyelesaikannya melalui override subkelas. Ubah ukuran gambar sebagai berikut:
untuk i: = 0 ke daftar grafis.count - 1 do
Mulai
Grafik: = Daftar Grafik [i];
Jika grafis.classname = 'persegi panjang' lalu
Mulai
Persegi panjang (grafik) .length: = persegi panjang (grafik) .length* 2;
Persegi panjang (grafik) .width: = persegi panjang (grafik) .width* 2;
akhir
lain jika grafik.classname = 'lingkaran' lalu
Mulai
Lingkaran (grafik).
akhir
akhir;
Anda dapat menambahkan metode "mengubah" ke kelas induk "grafik", kodenya adalah sebagai berikut
Grafik = kelas
...
Prosedur Perubahan (Tingkat: Integer);
akhir;
persegi panjang = kelas
...
Prosedur Perubahan (Tingkat: Integer);
akhir;
Lingkaran = kelas
...
Prosedur Perubahan (Tingkat: Integer);
akhir;
Kode untuk mengimplementasikan perubahan ukuran di kelas grafik tertentu:
Prosedur persegi panjang.
Mulai
Long: = long* rate;
Lebar: = Width* rate;
akhir;
Circular Prosedur.
Mulai
Radius: = Radius* rate;
akhir;
Setelah memodifikasi dengan cara ini, kode di atas dapat disebut seperti ini:
untuk i: = 0 ke daftar grafis.count - 1 do
Mulai
Grafik: = Daftar Grafik [i];
Graphics.ChangeSize (2);
akhir;
Ini membuat kode lebih jelas.
Tentu saja, dalam banyak kasus, solusi di atas tidak dapat digunakan saat menilai nama class. Misalnya, iterate Over Cotrols Form dan melakukan uji coba awal pada kontrol yang berbeda. Tidak mungkin bagi kita untuk menambahkan metode inisialisasi ke tcontrol, kita hanya dapat menggunakan untuk membedakan jenis subkelas tertentu. Kemudian saat ini saya merekomendasikan menggunakan operator IS alih -alih secara langsung membandingkan ClassName.
Penggunaan IS, Pernyataan AObject adalah hasil TFFORT dalam berbagai jenis AOBJECT:
AObject adalah Tobject, dan hasilnya salah;
AObject adalah Tform, dan hasilnya benar;
AObject adalah tform1, dan hasilnya benar;
AObject tedit, dan hasilnya salah;
AObject adalah nol, dan hasilnya salah;
Dari contoh di atas, kita dapat melihat keuntungan menggunakan IS. Di masa depan, tcooledit dapat digunakan untuk mempercantik antarmuka, jadi kode ini tidak perlu diubah, karena tcooledit adalah tedit;
Kedua, jika objek yang dinilai mungkin kosong, gunakan ClassName untuk menentukan apakah objek ditetapkan terlebih dahulu, jika tidak, kesalahan akses memori akan terjadi. Perwakilan Penghakiman harus ditulis sebagai: jika ditugaskan (AOBJECT) dan AOBJECT.ClassName = 'TClass1';
Alasan terakhir mengapa ClassName tidak digunakan sebagai penilaian adalah bahwa ClassName hanya digunakan untuk menggambarkan sifat -sifat kelas. Kesalahan logis.
Jika acontrol.classname = 'teidt' maka // kode ini hanya akan diperiksa jika Anda melihat bahwa edit pada awalnya tidak diuji;
Jika acontrol adalah teidt maka // tidak dapat dikompilasi dan dilewati;
Berdasarkan hal di atas, ketika perlu untuk menentukan jenis objek tertentu, pertama -tama, kita harus mempertimbangkan untuk menghindari pernyataan pemrosesan khusus seperti itu melalui pemrosesan polimorfik. dari ClassName.
Dalam kasus yang sangat khusus, mungkin tidak mendapatkan hasil yang diinginkan, seperti jika TEDIT dan TCOOLEDIT perlu ditangani secara terpisah. yang akan lebih baik daripada tidak sama sekali.
Acooledit adalah tedit // true;
acooledit.classtype = tedit // false;
acooledit.classtype = tcooledit // true;