Menguasai Kelas C#: Cetak Biru untuk Pemrograman Berorientasi Objek yang Kuat
Saat Anda mendefinisikan kelas, Anda mendefinisikan cetak biru untuk tipe data. Ini tidak sebenarnya mendefinisikan data apa pun, tetapi ini mendefinisikan apa artinya nama kelas. Artinya, objek kelas terdiri dari apa dan operasi apa yang dapat dilakukan pada objek tersebut. Objek adalah instance dari kelas. Metode dan variabel yang menyusun kelas disebut anggota kelas.
Mendefinisikan Kelas
Definisi kelas dimulai dengan kata kunci class diikuti oleh nama kelas; dan tubuh kelas dibungkus oleh sepasang kurung kurawal. Berikut adalah bentuk umum dari definisi kelas:
<access specifier> class class_name { // member variables <access specifier> <data type> variable1; <access specifier> <data type> variable2; ... <access specifier> <data type> variableN; // member methods <access specifier> <return type> method1(parameter_list) { // method body } <access specifier> <return type> method2(parameter_list) { // method body } ... <access specifier> <return type> methodN(parameter_list) { // method body } } Catatan:
Access specifier menentukan aturan akses untuk anggota serta kelas itu sendiri. Jika tidak disebutkan, maka access specifier default untuk tipe kelas adalah internal. Akses default untuk anggota adalah private.
Data type menentukan tipe variabel, dan return type menentukan tipe data dari data yang dikembalikan oleh metode, jika ada.
Untuk mengakses anggota kelas, Anda menggunakan operator titik (.).
Operator titik menghubungkan nama objek dengan nama anggota.
Contoh berikut mengilustrasikan konsep yang telah dibahas sejauh ini:
Live Demo
using System; namespace BoxApplication { class Box { public double length; // Panjang kotak public double breadth; // Lebar kotak public double height; // Tinggi kotak } class Boxtester { static void Main(string[] args) { Box Box1 = new Box(); // Deklarasi Box1 tipe Box Box Box2 = new Box(); // Deklarasi Box2 tipe Box double volume = 0.0; // Simpan volume kotak di sini // spesifikasi kotak 1 Box1.height = 5.0; Box1.length = 6.0; Box1.breadth = 7.0; // spesifikasi kotak 2 Box2.height = 10.0; Box2.length = 12.0; Box2.breadth = 13.0; // volume kotak 1 volume = Box1.height * Box1.length * Box1.breadth; Console.WriteLine("Volume of Box1 : {0}", volume); // volume kotak 2 volume = Box2.height * Box2.length * Box2.breadth; Console.WriteLine("Volume of Box2 : {0}", volume); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Volume of Box1 : 210 Volume of Box2 : 1560
Fungsi Anggota dan Enkapsulasi
Sebuah fungsi anggota dari kelas adalah fungsi yang memiliki definisi atau prototipe-nya dalam definisi kelas seperti variabel lain. Ini bekerja pada objek apa pun dari kelas tempat ia menjadi anggota, dan memiliki akses ke semua anggota kelas untuk objek tersebut.
Variabel anggota adalah atribut objek (dari perspektif desain) dan mereka disimpan private untuk mengimplementasikan enkapsulasi. Variabel ini hanya dapat diakses menggunakan fungsi anggota publik.
Mari kita terapkan konsep di atas untuk menetapkan dan mendapatkan nilai anggota kelas yang berbeda dalam sebuah kelas:
Live Demo
using System; namespace BoxApplication { class Box { private double length; // Panjang kotak private double breadth; // Lebar kotak private double height; // Tinggi kotak public void setLength( double len ) { length = len; } public void setBreadth( double bre ) { breadth = bre; } public void setHeight( double hei ) { height = hei; } public double getVolume() { return length * breadth * height; } } class Boxtester { static void Main(string[] args) { Box Box1 = new Box(); // Deklarasi Box1 tipe Box Box Box2 = new Box(); double volume; // Deklarasi Box2 tipe Box // spesifikasi kotak 1 Box1.setLength(6.0); Box1.setBreadth(7.0); Box1.setHeight(5.0); // spesifikasi kotak 2 Box2.setLength(12.0); Box2.setBreadth(13.0); Box2.setHeight(10.0); // volume kotak 1 volume = Box1.getVolume(); Console.WriteLine("Volume of Box1 : {0}" ,volume); // volume kotak 2 volume = Box2.getVolume(); Console.WriteLine("Volume of Box2 : {0}", volume); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Volume of Box1 : 210 Volume of Box2 : 1560
Konstruktor C#
Sebuah konstruktor kelas adalah fungsi anggota khusus dari kelas yang dieksekusi setiap kali kita membuat objek baru dari kelas tersebut.
Sebuah konstruktor memiliki nama yang sama persis dengan nama kelas dan tidak memiliki tipe pengembalian. Contoh berikut menjelaskan konsep konstruktor:
Live Demo
using System; namespace LineApplication { class Line { private double length; // Panjang garis public Line() { Console.WriteLine("Object is being created"); } public void setLength( double len ) { length = len; } public double getLength() { return length; } static void Main(string[] args) { Line line = new Line(); // set line length line.setLength(6.0); Console.WriteLine("Length of line : {0}", line.getLength()); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Object is being created Length of line : 6
Sebuah konstruktor default tidak memiliki parameter tetapi jika Anda perlu, konstruktor dapat memiliki parameter. Konstruktor semacam itu disebut konstruktor parameterized. Teknik ini membantu Anda menetapkan nilai awal ke objek pada saat pembuatannya seperti yang ditunjukkan dalam contoh berikut:
Live Demo
using System; namespace LineApplication { class Line { private double length; // Panjang garis public Line(double len) { //Parameterized constructor Console.WriteLine("Object is being created, length = {0}", len); length = len; } public void setLength( double len ) { length = len; } public double getLength() { return length; } static void Main(string[] args) { Line line = new Line(10.0); Console.WriteLine("Length of line : {0}", line.getLength()); // set line length line.setLength(6.0); Console.WriteLine("Length of line : {0}", line.getLength()); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Object is being created, length = 10 Length of line : 10 Length of line : 6
Destruktor C#
Sebuah destruktor adalah fungsi anggota khusus dari kelas yang dieksekusi setiap kali objek kelasnya keluar dari lingkup. Sebuah destruktor memiliki nama yang sama persis dengan nama kelas dengan awalan tilde (~) dan tidak dapat mengembalikan nilai atau mengambil parameter apa pun.
Destruktor dapat sangat berguna untuk melepaskan sumber daya memori sebelum keluar dari program. Destruktor tidak dapat diwarisi atau di-overload.
Contoh berikut menjelaskan konsep destruktor:
Live Demo
using System; namespace LineApplication { class Line { private double length; // Panjang garis public Line() { // constructor Console.WriteLine("Object is being created"); } ~Line() { //destructor Console.WriteLine("Object is being deleted"); } public void setLength( double len ) { length = len; } public double getLength() { return length; } static void Main(string[] args) { Line line = new Line(); // set line length line.setLength(6.0); Console.WriteLine("Length of line : {0}", line.getLength()); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Object is being created Length of line : 6 Object is being deleted
Anggota Statis Kelas C#
Kita dapat mendefinisikan anggota kelas sebagai static menggunakan kata kunci static. Saat kita mendeklarasikan anggota kelas sebagai static, berarti tidak peduli berapa banyak objek kelas yang dibuat, hanya ada satu salinan anggota statis.
Kata kunci static berarti hanya ada satu instance anggota yang ada untuk kelas. Variabel statis digunakan untuk mendefinisikan konstanta karena nilainya dapat diambil dengan memanggil kelas tanpa membuat instance dari kelas tersebut. Variabel statis dapat diinisialisasi di luar fungsi anggota atau definisi kelas. Anda juga dapat menginisialisasi variabel statis di dalam definisi kelas.
Contoh berikut menunjukkan penggunaan variabel statis:
Live Demo
using System; namespace StaticVarApplication { class StaticVar { public static int num; public void count() { num++; } public int getNum() { return num; } } class StaticTester { static void Main(string[] args) { StaticVar s1 = new StaticVar(); StaticVar s2 = new StaticVar(); s1.count(); s1.count(); s1.count(); s2.count(); s2.count(); s2.count(); Console.WriteLine("Variable num for s1: {0}", s1.getNum()); Console.WriteLine("Variable num for s2: {0}", s2.getNum()); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Variable num for s1: 6 Variable num for s2: 6
Anda juga dapat mendeklarasikan fungsi anggota sebagai static. Fungsi semacam itu hanya dapat mengakses variabel statis. Fungsi statis ada bahkan sebelum objek dibuat. Contoh berikut menunjukkan penggunaan fungsi statis:
Live Demo
using System; namespace StaticVarApplication { class StaticVar { public static int num; public void count() { num++; } public static int getNum() { return num; } } class StaticTester { static void Main(string[] args) { StaticVar s = new StaticVar(); s.count(); s.count(); s.count(); Console.WriteLine("Variable num: {0}", StaticVar.getNum()); Console.ReadKey(); } } } Ketika kode di atas dikompilasi dan dieksekusi, hasilnya adalah:
Variable num: 3