C # - Polimorfisme

Kata polymorphismartinya memiliki banyak bentuk. Dalam paradigma pemrograman berorientasi objek, polimorfisme sering dinyatakan sebagai 'satu antarmuka, beberapa fungsi'.

Polimorfisme bisa statis atau dinamis. Distatic polymorphism, respons ke suatu fungsi ditentukan pada waktu kompilasi. Didynamic polymorphism, diputuskan pada saat run-time.

Polimorfisme Statis

Mekanisme menghubungkan suatu fungsi dengan suatu objek selama waktu kompilasi disebut pengikatan awal. Ini juga disebut pengikatan statis. C # menyediakan dua teknik untuk mengimplementasikan polimorfisme statis. Mereka adalah -

  • Fungsi kelebihan beban
  • Operator kelebihan beban

Kami membahas kelebihan beban operator di bab berikutnya.

Fungsi Overloading

Anda dapat memiliki beberapa definisi untuk nama fungsi yang sama dalam lingkup yang sama. Definisi fungsi harus berbeda satu sama lain dengan jenis dan / atau jumlah argumen dalam daftar argumen. Anda tidak bisa membebani deklarasi fungsi yang hanya berbeda menurut tipe kembalian.

Contoh berikut menunjukkan penggunaan fungsi print() untuk mencetak tipe data yang berbeda -

using System;

namespace PolymorphismApplication {
   class Printdata {
      void print(int i) {
         Console.WriteLine("Printing int: {0}", i );
      }
      void print(double f) {
         Console.WriteLine("Printing float: {0}" , f);
      }
      void print(string s) {
         Console.WriteLine("Printing string: {0}", s);
      }
      static void Main(string[] args) {
         Printdata p = new Printdata();
         
         // Call print to print integer
         p.print(5);
         
         // Call print to print float
         p.print(500.263);
         
         // Call print to print string
         p.print("Hello C++");
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Printing int: 5
Printing float: 500.263
Printing string: Hello C++

Polimorfisme Dinamis

C # memungkinkan Anda untuk membuat kelas abstrak yang digunakan untuk menyediakan implementasi kelas parsial dari sebuah antarmuka. Implementasi selesai ketika kelas turunan mewarisi darinya.Abstractkelas berisi metode abstrak, yang diimplementasikan oleh kelas turunan. Kelas turunan memiliki fungsionalitas yang lebih khusus.

Berikut adalah aturan tentang kelas abstrak -

  • Anda tidak dapat membuat instance dari kelas abstrak

  • Anda tidak dapat mendeklarasikan metode abstrak di luar kelas abstrak

  • Saat kelas dideklarasikan sealed, tidak dapat diwariskan, kelas abstrak tidak dapat dinyatakan tertutup.

Program berikut menunjukkan kelas abstrak -

using System;

namespace PolymorphismApplication {
   abstract class Shape {
      public abstract int area();
   }
   
   class Rectangle:  Shape {
      private int length;
      private int width;
      
      public Rectangle( int a = 0, int b = 0) {
         length = a;
         width = b;
      }
      public override int area () { 
         Console.WriteLine("Rectangle class area :");
         return (width * length); 
      }
   }
   class RectangleTester {
      static void Main(string[] args) {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("Area: {0}",a);
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Rectangle class area :
Area: 70

Saat Anda memiliki fungsi yang ditentukan di kelas yang ingin Anda implementasikan di kelas yang diwarisi, Anda menggunakan virtualfungsi. Fungsi virtual dapat diimplementasikan secara berbeda di kelas yang diwariskan berbeda dan panggilan ke fungsi ini akan diputuskan pada waktu proses.

Polimorfisme dinamis diimplementasikan oleh abstract classes dan virtual functions.

Program berikut menunjukkan ini -

using System;

namespace PolymorphismApplication {
   class Shape {
      protected int width, height;
      
      public Shape( int a = 0, int b = 0) {
         width = a;
         height = b;
      }
      public virtual int area() {
         Console.WriteLine("Parent class area :");
         return 0;
      }
   }
   class Rectangle: Shape {
      public Rectangle( int a = 0, int b = 0): base(a, b) {

      }
      public override int area () {
         Console.WriteLine("Rectangle class area :");
         return (width * height); 
      }
   }
   class Triangle: Shape {
      public Triangle(int a = 0, int b = 0): base(a, b) {
      }
      public override int area() {
         Console.WriteLine("Triangle class area :");
         return (width * height / 2); 
      }
   }
   class Caller {
      public void CallArea(Shape sh) {
         int a;
         a = sh.area();
         Console.WriteLine("Area: {0}", a);
      }
   }  
   class Tester {
      static void Main(string[] args) {
         Caller c = new Caller();
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         
         c.CallArea(r);
         c.CallArea(t);
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dijalankan, itu menghasilkan hasil sebagai berikut -

Rectangle class area:
Area: 70
Triangle class area:
Area: 25