Penjelasan dan Contoh Inheritance C# Asp.Net


Inheritance, bersama dengan enkapsulasi dan polimorfisme, adalah salah satu dari tiga karakteristik utama pemrograman berorientasi obyek.

Inheritance memungkinkan kita membuat class baru yang menggunakan kembali, memperluas, dan memodifikasi perilaku yang didefinisikan di class lain.

class yang member inheritance disebut base class, dan class yang inheritance member tersebut disebut class turunan.

Class turunan hanya memiliki satu basis class. Namun, inheritance bersifat transitif. Jika ClassC berasal dari ClassB, dan ClassB berasal dari ClassA, ClassC inheritance member yang dinyatakan dalam ClassB dan ClassA.

Secara konseptual, class turunan adalah spesialisasi base class. Misalnya, jika Anda memiliki base class animal , kita mungkin memiliki satu class turunan yang dinamai Mamalia dan class turunan lain yang dinamai Reptil.

Mamalia adalah animal, dan Reptil adalah animal, namun masing-masing class turunan mewakili spesialisasi yang berbeda dari base class. Bila kita mendefinisikan class untuk diturunkan dari class lain, class turunan secara implisit memperoleh semua member base class, kecuali konstruktor dan finalizernya.

class turunan dengan demikian dapat menggunakan kembali kode di base class tanpa harus menerapkannya kembali. Di class turunan, kita bisa menambahkan lebih banyak member.

Dengan cara ini, class turunan memperluas fungsionalitas base class. Ilustrasi berikut menunjukkan class WorkItem yang mewakili item work dalam beberapa proses bisnis.

Seperti semua class, itu berasal dari System.Object dan inheritance semua metodnya. WorkItem menambahkan lima membernya sendiri. Ini termasuk konstruktor, karena konstruktor tidak inheritance.

Class ChangeRequest inheritance dari WorkItem dan mewakili work item tertentu.

ChangeRequest menambahkan dua member lagi ke member yang diinheritance dari WorkItem dan dari Object.

Ini harus menambahkan konstruktor sendiri, dan itu juga menambahkan originalItemID.

Properti asliItemID memungkinkan instance ChangeRequest dikaitkan dengan original WorkItem yang permintaan perubahannya berlaku.

  • Class inheritance 


Contoh berikut menunjukkan bagaimana hubungan class ditunjukkan dalam ilustrasi sebelumnya yang dinyatakan dalam C #.

Contoh juga menunjukkan bagaimana WorkItem menggantikan metode virtual Object.ToString, dan bagaimana class ChangeRequest inheritance penerapan metode WorkItem.
// WorkItem implicitly inherits from the Object class.
public class WorkItem
{
    // Static field currentID stores the job ID of the last WorkItem that
    // has been created.
    private static int currentID;

    //Properties.
    protected int ID { get; set; }
    protected string Title { get; set; }
    protected string Description { get; set; }
    protected TimeSpan jobLength { get; set; }

    // Default constructor. If a derived class does not invoke a base-
    // class constructor explicitly, the default constructor is called
    // implicitly. 
    public WorkItem()
    {
        ID = 0;
        Title = "Default title";
        Description = "Default description.";
        jobLength = new TimeSpan();
    }

    // Instance constructor that has three parameters.
    public WorkItem(string title, string desc, TimeSpan joblen)
    {
        this.ID = GetNextID();
        this.Title = title;
        this.Description = desc;
        this.jobLength = joblen;
    }

    // Static constructor to initialize the static member, currentID. This
    // constructor is called one time, automatically, before any instance
    // of WorkItem or ChangeRequest is created, or currentID is referenced.
    static WorkItem()
    {
        currentID = 0;
    }


    protected int GetNextID()
    {
        // currentID is a static field. It is incremented each time a new
        // instance of WorkItem is created.
        return ++currentID;
    }

    // Method Update enables you to update the title and job length of an
    // existing WorkItem object.
    public void Update(string title, TimeSpan joblen)
    {
        this.Title = title;
        this.jobLength = joblen;
    }

    // Virtual method override of the ToString method that is inherited
    // from System.Object.
    public override string ToString()
    {
        return String.Format("{0} - {1}", this.ID, this.Title);
    }
}

// ChangeRequest derives from WorkItem and adds a property (originalItemID) 
// and two constructors.
public class ChangeRequest : WorkItem
{
    protected int originalItemID { get; set; }

    // Constructors. Because neither constructor calls a base-class 
    // constructor explicitly, the default constructor in the base class
    // is called implicitly. The base class must contain a default 
    // constructor.

    // Default constructor for the derived class.
    public ChangeRequest() { }

    // Instance constructor that has four parameters.
    public ChangeRequest(string title, string desc, TimeSpan jobLen,
                         int originalID)
    {
        // The following properties and the GetNexID method are inherited 
        // from WorkItem.
        this.ID = GetNextID();
        this.Title = title;
        this.Description = desc;
        this.jobLength = jobLen;

        // Property originalItemId is a member of ChangeRequest, but not 
        // of WorkItem.
        this.originalItemID = originalID;
    }
}

class Program
{
    static void Main()
    {
        // Create an instance of WorkItem by using the constructor in the 
        // base class that takes three arguments.
        WorkItem item = new WorkItem("Fix Bugs",
                                     "Fix all bugs in my code branch",
                                     new TimeSpan(3, 4, 0, 0));

        // Create an instance of ChangeRequest by using the constructor in
        // the derived class that takes four arguments.
        ChangeRequest change = new ChangeRequest("Change Base Class Design",
                                                 "Add members to the class",
                                                 new TimeSpan(4, 0, 0),
                                                 1);

        // Use the ToString method defined in WorkItem.
        Console.WriteLine(item.ToString());

        // Use the inherited Update method to change the title of the 
        // ChangeRequest object.
        change.Update("Change the Design of the Base Class",
            new TimeSpan(4, 0, 0));

        // ChangeRequest inherits WorkItem's override of ToString.
        Console.WriteLine(change.ToString());

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}
/* Output:
    1 - Fix Bugs
    2 - Change the Design of the Base Class
*/

  • Abstract and Virtual Methods 


Ketika base class declares sebuah metod sebagai virtual, class turunan dapat mengganti metod dengan implementasinya.

Jika base class menyatakan member sebagai abstrak, metod itu harus diganti dalam class non-abstrak yang secara langsung inheritance dari class itu.

Jika class turunan itu sendiri abstrak, ia
 inherits member abstrak tanpa menerapkannya.

Abstrak dan virtual member adalah basis untuk polimorfisme, yang merupakan second primary characteristic dari pemrograman berorientasi obyek

  • Abstract Base Classes 


Kita bisa mendeklarasikan class sebagai abstrak jika kita ingin mencegah instantiasi langsung dengan menggunakan keyword new.

Jika kita melakukan ini, class hanya bisa digunakan jika class new diturunkan darinya. class abstrak dapat berisi satu atau lebih sign metod yang dinyatakan sebagai abstrak.

Sign ini menentukan parameter dan return value namun tidak memiliki implementasi (metod body).

Class abstrak tidak harus mengandung member abstrak; Namun, jika sebuah class mengandung member abstrak, class itu sendiri harus dinyatakan abstrak.

Class turunan yang tidak abstrak sendiri harus menyediakan penerapan metode abstrak dari base Class abstrak

  • Interfaces 


Interfaces adalah tipe data referensi yang agak mirip dengan base class abstrak yang hanya terdiri dari member abstrak.

Ketika sebuah class menerapkan sebuah interfaces, ia harus memberikan implementasi untuk semua member interfaces.

Sebuah class dapat mengimplementasikan beberapa interfaces meskipun hanya bisa berasal dari single direct base class.

Interfaces digunakan untuk mendefinisikan kemampuan spesifik untuk class yang tidak harus memiliki hubungan "adalah".

Sebagai contoh, interfaces System.IEquatable dapat diimplementasikan oleh class atau struct yang harus mengaktifkan klien code untuk menentukan apakah dua objek dari tipe itu setara (namun tipe data mendefinisikan kesetaraan).

 IEquatable tidak menyiratkan tipe data yang sama dari "adalah" hubungan yang ada antara base classs dan class turunan (misalnya, Mamalia adalah Animal).

  • Preventing Further Derivation 


Class dapat mencegah class lain inheritance darinya, atau dari membernya, dengan menyatakan dirinya atau member yang dimeteraikan. 

Derived Class Hiding of Base Class Members Class turunan dapat menyembunyikan member base class dengan menyatakan member dengan nama dan sign yang sama.

Pengubah new dapat digunakan untuk secara eksplisit menunjukkan bahwa member tidak dimaksudkan sebagai pengganti base member. 

Penggunaan yang baru tidak diperlukan, tapi peringatan kompilator akan dihasilkan jika baru tidak digunakan.
Previous
Next Post »