Bagikan melalui


Kelas dan Metode Parsial (Panduan Pemrograman C#)

Dimungkinkan untuk membagi definisi kelas, struct, antarmuka, atau metode lebih dari dua file sumber atau lebih. Setiap file sumber berisi bagian dari jenis atau definisi metode, dan semua bagian digabungkan saat aplikasi dikompilasi.

Kelas Parsial

Ada beberapa situasi ketika memisahkan definisi kelas diinginkan:

  • Mendeklarasikan kelas melalui file terpisah memungkinkan beberapa programmer untuk mengerjakannya secara bersamaan.
  • Anda dapat menambahkan kode ke kelas tanpa harus membuat ulang file sumber yang menyertakan sumber yang dihasilkan secara otomatis. Visual Studio menggunakan pendekatan ini ketika membuat Formulir Windows, kode pembungkus layanan Web, dan sebagainya. Anda dapat membuat kode yang menggunakan kelas-kelas ini tanpa harus memodifikasi file yang dibuat oleh Visual Studio.
  • Generator sumber dapat menghasilkan fungsionalitas tambahan di kelas.

Untuk memisahkan definisi kelas, gunakan pengubah kata kunci parsial, seperti yang ditunjukkan di sini:

public partial class Employee
{
    public void DoWork()
    {
    }
}

public partial class Employee
{
    public void GoToLunch()
    {
    }
}

Kata kunci partial mengindikasikan bahwa bagian lain dari kelas, struktur, atau antarmuka dapat didefinisikan dalam namespace layanan. Semua bagian harus menggunakan kata kunci partial. Semua bagian harus tersedia pada waktu kompilasi untuk membentuk jenis akhir. Semua bagian harus memiliki aksesibilitas yang sama, seperti public, private, dan sebagainya.

Jika ada bagian yang dinyatakan abstrak, maka seluruh jenis dianggap abstrak. Jika ada bagian yang dinyatakan disegel, maka seluruh jenis dianggap tertutup. Jika ada bagian yang mendeklarasikan jenis dasar, maka seluruh jenis mewarisi kelas tersebut.

Semua bagian yang menentukan kelas dasar harus setuju, tetapi bagian yang menghilangkan kelas dasar masih mewarisi jenis dasar. Bagian dapat menentukan antarmuka dasar yang berbeda, dan jenis akhir mengimplementasikan semua antarmuka yang tercantum oleh semua deklarasi parsial. Setiap anggota kelas, struktur, atau antarmuka yang dideklarasikan dalam definisi parsial tersedia untuk semua bagian lainnya. Jenis terakhir adalah kombinasi dari semua bagian pada waktu kompilasi.

Catatan

Pengubah partial tidak tersedia pada deklarasi delegasi atau enumerasi.

Contoh berikut menunjukkan bahwa jenis berlapis dapat berupa parsial, bahkan jika jenis yang ditumpuk di dalamnya tidak sebagian.

class Container
{
    partial class Nested
    {
        void Test() { }
    }

    partial class Nested
    {
        void Test2() { }
    }
}

Pada waktu kompilasi, atribut definisi jenis parsial digabungkan. Misalnya, pertimbangkan deklarasi berikut:

[SerializableAttribute]
partial class Moon { }

[ObsoleteAttribute]
partial class Moon { }

Ini setara dengan deklarasi berikut:

[SerializableAttribute]
[ObsoleteAttribute]
class Moon { }

Berikut ini digabungkan dari semua definisi jenis parsial:

  • Komentar XML
  • antarmuka
  • atribut parameter tipe generik
  • atribut kelas
  • anggota

Misalnya, pertimbangkan deklarasi berikut:

partial class Earth : Planet, IRotate { }
partial class Earth : IRevolve { }

Ini setara dengan deklarasi berikut:

class Earth : Planet, IRotate, IRevolve { }

Batasan

Ada beberapa aturan yang harus diikuti saat Anda bekerja dengan definisi kelas parsial:

  • Semua definisi jenis parsial yang dimaksudkan untuk menjadi bagian dari jenis yang sama harus dimodifikasi dengan partial. Misalnya, deklarasi kelas berikut menghasilkan kesalahan:
    public partial class A { }
    //public class A { }  // Error, must also be marked partial
    
  • Pengubah partial hanya dapat muncul segera sebelum kata kunci class, , structatau interface.
  • Jenis parsial bersarang diperbolehkan dalam definisi jenis parsial seperti yang diilustrasikan dalam contoh berikut:
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
    partial class ClassWithNestedClass
    {
        partial class NestedClass { }
    }
    
  • Semua definisi jenis parsial yang dimaksudkan untuk menjadi bagian dari jenis yang sama harus didefinisikan dalam rakitan yang sama dan modul yang sama (file .exe atau .dll). Definisi parsial tidak dapat mencakup beberapa modul.
  • Nama kelas dan parameter jenis generik harus cocok pada semua definisi jenis parsial. Jenis generik dapat bersifat parsial. Setiap deklarasi parsial harus menggunakan nama parameter yang sama dalam urutan yang sama.
  • Kata kunci berikut pada definisi jenis parsial bersifat opsional, tetapi jika ada pada satu definisi jenis parsial, tidak dapat bertentangan dengan kata kunci yang ditentukan pada definisi parsial lain untuk jenis yang sama:

Untuk informasi selengkapnya, lihat Batasan pada Parameter Jenis.

Contoh

Dalam contoh berikut, bidang dan konstruktor kelas, Coords, dinyatakan dalam satu definisi kelas parsial, dan anggota, PrintCoords, dinyatakan dalam definisi kelas parsial lainnya.

public partial class Coords
{
    private int x;
    private int y;

    public Coords(int x, int y)
    {
        this.x = x;
        this.y = y;
    }
}

public partial class Coords
{
    public void PrintCoords()
    {
        Console.WriteLine("Coords: {0},{1}", x, y);
    }
}

class TestCoords
{
    static void Main()
    {
        Coords myCoords = new Coords(10, 15);
        myCoords.PrintCoords();

        // Keep the console window open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
// Output: Coords: 10,15

Contoh berikut menunjukkan bahwa Anda juga dapat mengembangkan struktur dan antarmuka parsial.

partial interface ITest
{
    void Interface_Test();
}

partial interface ITest
{
    void Interface_Test2();
}

partial struct S1
{
    void Struct_Test() { }
}

partial struct S1
{
    void Struct_Test2() { }
}

Metode Parsial

Kelas atau struktur parsial dapat berisi metode parsial. Salah satu bagian dari kelas berisi tanda tangan metode. Implementasi dapat didefinisikan di bagian yang sama atau bagian lain.

Implementasi tidak diperlukan untuk metode parsial saat tanda tangan mematuhi aturan berikut:

  • Deklarasi tidak menyertakan pengubah akses apa pun. Metode ini memiliki private akses secara default.
  • Jenis pengembaliannya adalah void.
  • Tidak ada parameter yang memiliki pengubah out .
  • Deklarasi metode tidak dapat menyertakan salah satu pengubah berikut:

Metode dan semua panggilan ke metode dihapus pada waktu kompilasi ketika tidak ada implementasi.

Metode apa pun yang tidak sesuai dengan semua batasan tersebut (misalnya, metode public virtual partial void), harus menyediakan implementasi. Implementasi tersebut mungkin disediakan oleh generator sumber.

Metode parsial memungkinkan pengimplementasi satu bagian kelas untuk mendeklarasikan suatu metode. Pengimplementasi bagian lain dari kelas dapat menentukan metode itu. Ada dua skenario di mana pemisahan ini berguna: templat yang menghasilkan kode boilerplate, dan generator sumber.

  • Kode templat: Templat mencadangkan nama dan tanda tangan metode sehingga kode yang dihasilkan dapat memanggil metode. Metode ini mengikuti pembatasan yang memungkinkan pengembang untuk memutuskan apakah akan mengimplementasikan metode ini. Jika metode tidak diimplementasikan, pengkompilasi akan menghapus tanda tangan metode dan semua panggilan ke metode . Panggilan ke metode, termasuk hasil apa pun yang akan terjadi dari evaluasi argumen dalam panggilan, tidak berpengaruh pada durasi. Oleh karena itu, kode apa pun di kelas parsial dapat dengan bebas menggunakan metode parsial, bahkan jika implementasi tidak disediakan. Tidak ada kesalahan waktu kompilasi atau run-time yang dihasilkan jika metode dipanggil tetapi tidak diimplementasikan.
  • Generator sumber: Generator sumber menyediakan implementasi untuk metode. Pengembang manusia dapat menambahkan deklarasi metode (sering kali dengan atribut yang dibaca oleh generator sumber). Pengembang dapat menulis kode yang memanggil metode ini. Generator sumber berjalan selama kompilasi dan menyediakan implementasi. Dalam skenario ini, pembatasan untuk metode parsial yang mungkin tidak sering diimplementasikan tidak diikuti.
// Definition in file1.cs
partial void OnNameChanged();

// Implementation in file2.cs
partial void OnNameChanged()
{
  // method body
}
  • Deklarasi metode parsial harus dimulai dengan kata kunci kontekstual parsial.
  • Tanda tangan metode parsial di kedua bagian jenis parsial harus cocok.
  • Metode parsial dapat memiliki pengubah statis dan tak terkelola.
  • Metode parsial bisa bersifat generik. Batasan harus sama pada deklarasi metode yang menentukan dan menerapkan. Nama parameter dan jenis parameter tidak harus sama dalam deklarasi penerapan seperti dalam yang menentukan.
  • Anda dapat membuat delegasi ke metode parsial yang ditentukan dan diimplementasikan, tetapi tidak ke metode parsial yang tidak memiliki implementasi.

Spesifikasi Bahasa C#

Untuk informasi selengkapnya, lihat Jenis parsial dan Metode parsial dalam Spesifikasi Bahasa C#. Spesifikasi bahasa adalah sumber definitif untuk sintaks dan penggunaan C#. Fitur tambahan untuk metode parsial didefinisikan dalam spesifikasi fitur.

Lihat juga