Overloading dan overriding


104

Apa perbedaan antara overloading dan overriding.


2
@james: apakah Anda setidaknya mencoba google ??
Mitch Wheat

Saya menduga Anda tidak akan mendapatkan yang ini.
Jon B

james- mungkin tidak dan saya merasa sangat konyol karena tidak bisa menjelaskan konsep sederhana

1
@james tebakan saya adalah Anda mengetahui konsep ini tanpa mengetahui istilahnya. Saya akan menebak Anda otodidak. Anda mungkin harus mengambil buku C # tingkat pemula, bukan untuk belajar tetapi untuk memperkuat apa yang sudah Anda ketahui. Ini mematikan pikiran tetapi akan sangat membantu dalam wawancara teknologi.
Michael Meadows

Anda dapat membaca lebih lanjut di tautan ini: intquesans.blogspot.com/2011/05/…

Jawaban:


219

Kelebihan beban

Overloading adalah saat Anda memiliki beberapa metode dalam cakupan yang sama, dengan nama yang sama tetapi tanda tangan berbeda.

//Overloading
public class test
{
    public void getStuff(int id)
    {}
    public void getStuff(string name)
    {}
}

Utama

Mengganti adalah prinsip yang memungkinkan Anda mengubah fungsionalitas metode di kelas anak.

//Overriding
public class test
{
        public virtual void getStuff(int id)
        {
            //Get stuff default location
        }
}

public class test2 : test
{
        public override void getStuff(int id)
        {
            //base.getStuff(id);
            //or - Get stuff new location
        }
}

1
saya suka jawaban ini @cgreeno .. Terima kasih
Ferrakkem Bhuiyan

1
@cgreeno saya pikir Anda ketinggalan voiduntuk getStuffmasuktest2
Mahdi

2
hanya untuk menyebutkan bahwa metode kelas dasar harus ditandai sebagai virtual untuk menimpa, jika tidak, Anda akan mendapatkan kesalahan kompilasi.
Alex Stephens

Hei, ini mungkin sudah tua tapi saya masih punya pertanyaan tentang ini. Apakah kelebihan beban membuatnya tersedia untuk memiliki lebih banyak fungsi dengan metode 'satu'? Seperti saya bisa melakukan ini: getStuff(2, "Hello world!");atau saya bisa melakukan ini getStuff("Myname", "Mysurname", "Hello World!");? Adakah yang bisa memastikan ini adalah cara untuk melakukannya?
Sj03rs

Saya pikir contoh Overriding sebenarnya adalah Overwriting, override adalah ketika metode kelas super Anda menimpa secara tidak sengaja atau jika Anda bermaksud melakukannya dengan menggunakan kata kunci baru dalam kedua kasus, menimpa atau menimpa, behaivor berbeda ketika Anda mendeklarasikan Induk p = baru Anak(); p.Method (); ... mungkin saya salah dan itu hanyalah cara lain untuk melakukan hal yang hampir sama. Adakah yang bisa menjelaskannya lebih baik dari saya?
Cristina Carrasco

35

Definisi sederhana untuk overloading dan override

Overloading (Compile Time Polymorphism) :: Berfungsi dengan nama yang sama dan parameter yang berbeda

public class A
{
    public void print(int x, int y)
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public void print(float x, float y)
    {
        Console.WriteLine("Overload child method");
    }
}

Overriding (Run Time Polymorphism) :: Fungsi di kelas yang diperluas dengan nama yang sama dan parameter yang sama seperti di kelas dasar, tetapi dengan perilaku yang berbeda.

public class A
{
    public virtual void print()
    {
        Console.WriteLine("Parent Method");
    }
}

public class B : A
{
    public void child()
    {
        Console.WriteLine("Child Method");
    }

    public override void print()
    {
        Console.WriteLine("Overriding child method");
    }
}

Mungkin Anda ingin menambahkan bahwa konsep utama berlaku untuk hubungan kelas-sub kelas induk.
Freakyuser

10

Saya ingin membagikan contoh yang sangat masuk akal bagi saya ketika saya belajar:

Ini hanyalah contoh yang tidak menyertakan metode virtual atau kelas dasar. Sekadar memberi petunjuk tentang gagasan utama.

Katakanlah ada mesin cuci Kendaraan dan memiliki fungsi yang disebut "Mencuci" dan menerima Mobil sebagai tipenya.

Mendapat masukan Mobil dan mencuci Mobil.

public void Wash(Car anyCar){
       //wash the car
}

Mari membebani fungsi Wash ()

Beban berlebih:

public void Wash(Truck anyTruck){
   //wash the Truck  
}

Fungsi mencuci hanya untuk mencuci Mobil sebelumnya, tetapi sekarang kelebihan beban untuk mencuci Truk juga.

  • Jika objek input yang disediakan adalah Mobil, maka akan melakukan Cuci (Mobil anyCar)
  • Jika input object yang diberikan adalah Truck, maka akan melakukan Wash (Truck anyTruck)

Mari kita timpa fungsi Wash ()

Utama:

public override void Wash(Car anyCar){
   //check if the car has already cleaned
   if(anyCar.Clean){ 
       //wax the car
   }
   else{
       //wash the car
       //dry the car
       //wax the car
   }     
}

Fungsi mencuci kini memiliki syarat untuk mengecek apakah Mobil sudah bersih dan tidak perlu dicuci lagi.

  • Jika Mobil bersih, maka cukup wax.

  • Jika tidak bersih, cuci mobil terlebih dahulu, keringkan, lalu wax

.

Jadi fungsinya telah diganti dengan menambahkan fungsionalitas baru atau melakukan sesuatu yang sama sekali berbeda.


1
Ini pasti jawabannya. Memilih +
Jack

9
  • Overloading = Beberapa tanda tangan metode, nama metode yang sama
  • Overriding = Tanda tangan metode yang sama (dinyatakan virtual), diimplementasikan di sub kelas

Pewawancara yang cerdik akan menindaklanjuti dengan:

Apa perbedaan antara overriding dan shadowing?


Tidak pernah tahu itu disebut membayangi, bagus untuk diketahui. Satu-satunya relasi yang dimiliki overloading dan overriding adalah overing.
Samuel

4

Seperti yang dikatakan Michael:

  • Overloading = Beberapa tanda tangan metode, nama metode yang sama
  • Overriding = Tanda tangan metode yang sama (dinyatakan virtual), diimplementasikan di sub kelas

dan

  • Shadowing = Jika diperlakukan sebagai DerivedClass, ia menggunakan metode turunan, jika sebagai BaseClass ia menggunakan metode dasar.

3

Memiliki lebih dari satu metode / konstruktor dengan nama yang sama tetapi parameter yang berbeda disebut overloading. Ini adalah acara waktu kompilasi.

Class Addition 
{
   int add(int a, int b) 
   {
     return a+b;
   }
   int add(int a, int b, int c)
   {
     return a+b+c;
   }

   public static main (String[] args) 
   {
     Addition addNum = new Addition();
     System.out.println(addNum.add(1,2));
     System.out.println(addNum.add(1,2,3));
   }
}

O / p:

3
6

Mengganti adalah peristiwa waktu proses, yang berarti berdasarkan kode Anda, keluaran berubah pada waktu proses.

class Car
{
    public int topSpeed() 
    {
        return 200;
    }
}
class Ferrari extends Car
{
    public int topSpeed()
    {
        return 400;
    }
    public static void main(String args[])
    {
        Car car = new Ferrari();
        int num= car.topSpeed();
        System.out.println("Top speed for this car is: "+num);
    }
}

Perhatikan ada metode umum di kedua kelas topSpeed ​​(). Sejak kami menggunakan Ferrari, kami mendapatkan hasil yang berbeda.

O / p:

Top speed for this car is: 400

2

di C # tidak ada Java seperti hidden override, tanpa kata kunci override pada metode overriding! lihat implementasi C # ini:

varian 1 tanpa override : hasilnya 200

    class Car {
        public int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

varian 2 dengan override keyword: hasilnya 400

    class Car {
        public virtual int topSpeed() {
            return 200;
        }
    }

    class Ferrari : Car {
        public override int topSpeed(){
                return 400;
        }
    }

    static void Main(string[] args){
        Car car = new Ferrari();
        int num= car.topSpeed();
        Console.WriteLine("Top speed for this car is: "+num);
        Console.ReadLine();
    }

Kata kunci virtual pada kelas Car kebalikan dari final di Java, artinya belum final , Anda bisa menimpa, atau mengimplementasikan jika Car itu abstrak


1

shadowing = mempertahankan dua definisi di kelas turunan dan untuk memproyeksikan definisi kelas dasar, ia membayangi (menyembunyikan) definisi kelas turunan dan sebaliknya.


1

Hal lain untuk ditambahkan.

Overloading Lebih dari satu metode dengan nama yang sama. Jenis pengembalian yang sama atau berbeda. Tidak ada parameter yang berbeda atau jenis parameter yang berbeda. Di kelas yang sama atau kelas turunan.

int Add (int num1, int num2) int Add (int num1, int num2, int num3) double Add (int num1, int num2) double Add (double num1, double num2)

Bisa dimungkinkan di kelas yang sama atau kelas turunan. Umumnya lebih memilih di kelas yang sama. Misalnya Console.WriteLine () memiliki 19 metode kelebihan beban.

Dapat membebani konstruktor kelas, metode.

Dapat dianggap sebagai polimorfisme Waktu Kompilasi (statis / Pengikatan Awal).

================================================== ================================================== =

Penimpaan tidak dapat dilakukan di kelas yang sama. Dapat Mengganti metode kelas, properti, pengindeks, peristiwa.

Memiliki beberapa batasan seperti Metode dasar yang diganti harus virtual, abstrak, atau menimpa. Anda tidak dapat menggunakan pengubah baru, statis, atau virtual untuk mengubah metode penggantian.

Dapat Dianggap sebagai polimorfisme Run Time (Dynamic / Late Binding).

Membantu dalam pembuatan versi http://msdn.microsoft.com/en-us/library/6fawty39.aspx

================================================== ================================================== =

Tautan Bermanfaat

http://msdn.microsoft.com/en-us/library/ms173152.aspx Mengompilasi polimorfisme waktu vs. polimorfisme waktu proses


Bagus, dengan detail yang dibutuhkan.
pengguna3885927

1

Overloading adalah bagian dari polimorfisme statis dan digunakan untuk mengimplementasikan metode berbeda dengan nama yang sama tetapi tanda tangan berbeda. Mengganti digunakan untuk menyelesaikan metode yang tidak lengkap. Menurut saya tidak ada perbandingan antara kedua konsep ini, satu-satunya hal yang mirip adalah keduanya hadir dengan kosakata yang sama yaitu berakhir.


Kapten di sini: Membebani metode memberi Anda banyak tanda tangan dari metode berbeda dengan nama yang sama. Mengganti menyembunyikan anggota yang diwariskan, baik dari kelas atau antarmuka. terbang jauh
SparK

1
@SparK Overriding tidak menyembunyikan anggota. Anda dapat baik menimpa atau menyembunyikan anggota diwariskan. Keduanya adalah opsi yang saling eksklusif.
Pelayanan

@ Sererv, pilihan kata salah, maksud saya "pengganti".
SparK

0

Metode overloading dan Metode overriding adalah 2 konsep berbeda yang sama sekali berbeda. Metode overloading memiliki nama metode yang sama tetapi dengan tanda tangan yang berbeda. Penimpaan metode mengubah implementasi default metode kelas dasar di kelas turunan. Di bawah ini Anda dapat menemukan 2 video tutorial bagus yang menjelaskan konsep-konsep ini.

Metode mengganti penyembunyian Vs

Metode overloading


0

Overloading adalah konsep di mana Anda memiliki tanda tangan atau metode yang sama dengan nama yang sama tetapi parameter yang berbeda dan menimpa, kami memiliki metode nama yang sama dengan parameter berbeda juga memiliki warisan yang dikenal sebagai overriding.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.