Kelas parsial dalam dll yang terpisah

154

Apakah mungkin untuk memiliki dua bagian (namespace yang sama, nama kelas yang sama) ke kelas parsial dalam DLL terpisah?

Brad
sumber
seperti yang lain mengatakan itu tidak mungkin, tetapi ada cara untuk melengkapi kelas dengan perilaku baru dari sumber yang berbeda, apa sebenarnya yang ingin Anda lakukan di dll yang berbeda?
Ozan
Dalam kasus saya, saya ingin menambahkan beberapa metode statis ke kelas yang didefinisikan di perpustakaan pihak ke-3. Metode ekstensi tidak akan berfungsi dan antarmuka maupun warisan tidak akan berfungsi, karena kelasnya statis. Setelah menemukan bahwa Anda dapat memiliki sebagian kelas statis, saya datang ke sini untuk mencari tahu apakah itu berfungsi di seluruh majelis tetapi sayangnya sepertinya ini tidak akan berhasil.
Ben

Jawaban:

232

Dari MSDN -Kelas dan Metode Darurat :

Semua definisi tipe parsial yang dimaksudkan sebagai bagian dari tipe yang sama harus didefinisikan dalam rakitan yang sama dan modul yang sama (file .exe atau .dll). Definisi parsial tidak dapat menjangkau beberapa modul.

Justin Niessner
sumber
36

Tidak. Kelas parsial adalah fitur bahasa murni. Saat perakitan dikompilasi, file-file tersebut digabungkan untuk membuat tipe. Tidak mungkin untuk menyebar file ke majelis yang berbeda.

Bergantung pada apa yang ingin Anda lakukan, Anda mungkin dapat menggunakan metode ekstensi untuk mencapai apa yang Anda butuhkan.

Adam Robinson
sumber
13

Tidak itu tidak mungkin. Ketika perakitan dikompilasi, kelas harus diselesaikan.

Darin Dimitrov
sumber
8

Sementara jawaban lain memberikan "Tidak" yang tidak menyenangkan bahwa siapa pun yang mendarat di halaman ini tidak ingin melihat atau mendengar, saya dikejutkan oleh pemikiran lain yang belum disebutkan di sini. Jika kelas parsial diizinkan di seluruh majelis, seseorang akan mendapatkan akses ke anggota pribadi dari jenis yang ada yang tidak ditulis olehnya, sehingga memungkinkannya untuk memanipulasi mereka dengan cara yang tidak dimaksudkan oleh penulis asli, sehingga membahayakan fungsionalitas semua kelas yang mewarisi terlalu.

Tidak hanya itu, kelas-kelas di majelis lain (dan anak-anak mereka) perlu dikompilasi ulang untuk membuatnya bekerja. Dengan demikian secara logis tidak mungkin untuk memungkinkan pemisahan kelas pada majelis yang berbeda.

dotNET
sumber
Seseorang dapat dengan mudah mengacaukan dengan anggota pribadi melalui refleksi jika benar-benar diperlukan. Tidak mungkin untuk membagi kelas antara majelis karena referensi melingkar tidak diperbolehkan dan mereka akan diperlukan agar bagian-bagian berbeda dari kelas untuk berinteraksi.
Zar Shardan
6

Anda dapat menggunakan metode ekstensi ketika Anda ingin menambahkan metode ke kelas di dll yang berbeda. Satu kelemahan dari metode ini adalah Anda tidak dapat menambahkan metode statis.

thumbmunkeys
sumber
3

Pertanyaannya adalah mengapa Anda ingin membuat kelas parsial di majelis lain? Anda dapat mendefinisikan kelas dan antarmuka abstrak di seluruh majelis, mungkin Anda perlu melihatnya.

Gleno
sumber
10
IMHO ada kasus yang valid, misalnya: Anda mungkin ingin menambahkan penjelasan bentuk MVC ke kelas model yang ditentukan dalam majelis berbeda. Majelis itu sendiri tidak tahu di mana konteks itu digunakan, sehingga kelas di majelis tidak boleh memiliki penjelasan. Mereka dapat ditambahkan dalam kelas parsial dalam konteks MVC (jika memungkinkan).
nyi
3
nyi, mengapa tidak mewarisi dari kelas itu dan menyatakan atribut Anda di atas? Anda bahkan dapat menyebutnya dengan nama yang sama, jika diinginkan.
Gleno
0

Anda mungkin hanya ingin membuat kelas Wrapper di perpustakaan Anda sendiri, sekitar kelas di perpustakaan bagian ke-3. Kemudian tambahkan fungsionalitas apa pun ke kelas pembungkus.

Joakim Kungsman
sumber