Aşırı yükleme ve geçersiz kılma


104

Aşırı yükleme ve geçersiz kılma arasındaki fark nedir?


2
@james: en azından google'ı denedin mi ??
Mitch Wheat

Sanırım bunu alamayacaksın.
Jon B

james- muhtemelen hayır ve basit bir kavramı açıklayamadığım için kendimi aptal gibi hissediyorum

1
@james bence bu kavramları terimleri bilmeden sezdin. Kendi kendini yetiştirdiğini tahmin edeceğim. Muhtemelen başlangıç ​​seviyesinde bir C # kitabı almalısınız, öğrenmek için değil, zaten bildiklerinizi pekiştirmek için. Zihin uyuşturuyor ama teknik röportajlarda çok yardımcı olacak.
Michael Meadows

bu bağlantıdan daha fazlasını okuyabilirsiniz: intquesans.blogspot.com/2011/05/…

Yanıtlar:


220

Aşırı yükleme

Aşırı yükleme, aynı kapsamda aynı ada sahip ancak farklı imzalara sahip birden fazla yönteme sahip olmanızdır.

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

Geçersiz kılma

Geçersiz kılma, bir alt sınıftaki bir yöntemin işlevselliğini değiştirmenize izin veren bir ilkedir.

//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
bu yanıtı seviyorum @cgreeno .. Teşekkürler
Ferrakkem Bhuiyan

1
@cgreeno i kaçırmak düşünüyorum voidiçin getStuffdetest2
Mehdi

2
Temel sınıf yönteminin geçersiz kılmak için sanal olarak işaretlenmesi gerektiğini belirtmek gerekirse, aksi takdirde bir derleme hatası alırsınız.
Alex Stephens

Hey, bu eski olabilir ama bununla ilgili hala bir sorum var. Aşırı yükleme, 'tek' yöntemle daha fazla işlevselliğe sahip olmayı mümkün kılıyor mu? Bunu yapabileceğim gibi: getStuff(2, "Hello world!");veya bunu yapabilir miyim getStuff("Myname", "Mysurname", "Hello World!");? Bunu yapmanın yolu olduğunu herkes onaylayabilir mi?
Sj03rs

Bence Geçersiz Kılma örneği aslında Üzerine Yazmadır, geçersiz kılma, süper sınıf yönteminin yanlışlıkla geçersiz kılınmasıdır veya bunu her iki durumda da yeni anahtar kelimeyi kullanarak yapmak istiyorsanız, geçersiz kılma veya üzerine yazma, Ebeveyn p = new olarak bildirdiğinizde davranış farklıdır. Çocuk(); p.Method (); ... belki yanılıyorum ve neredeyse aynı şeyi yapmanın başka bir yolu. Bunu benden daha iyi açıklayan var mı?
Cristina Carrasco

35

Aşırı yükleme ve geçersiz kılma için basit tanımlar

Aşırı yükleme (Derleme Süresi Polimorfizmi) :: Aynı ada ve farklı parametrelere sahip işlevler

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");
    }
}

Overrideing (Run Time Polymorphism) :: Genişletilmiş sınıftaki, temel sınıftakiyle aynı ada ve aynı parametrelere sahip, ancak farklı davranışlara sahip işlevler.

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");
    }
}

Belki de geçersiz kılan kavramın ana sınıf-alt sınıf ilişkisi için geçerli olduğunu eklemek istersiniz.
Freakyuser

10

Öğrenirken bana çok anlamlı gelen bir örnek paylaşmak istiyorum:

Bu, sanal yöntemi veya temel sınıfı içermeyen bir örnektir. Sadece ana fikirle ilgili bir ipucu vermek için.

Diyelim ki bir Araç yıkama makinası var ve "Yıka" denen bir işlevi var ve Tipi olarak Arabayı kabul ediyor.

Araba girişini alır ve Arabayı yıkar.

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

Wash () fonksiyonunu aşırı yükleyelim

Aşırı yükleme:

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

Yıkama işlevi daha önce sadece bir Arabayı yıkamaktı, ancak şimdi bir Kamyonu da yıkamak için aşırı yüklendi.

  • Sağlanan giriş nesnesi bir Araba ise, Wash (Car anyCar) yürütecektir.
  • Sağlanan giriş nesnesi bir Kamyon ise, Yıkama (Kamyon anyTruck) işlemini gerçekleştirecektir.

Wash () işlevini geçersiz kılalım

Geçersiz kılma:

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
   }     
}

Yıkama işlevi artık Aracın zaten temiz olup olmadığını ve tekrar yıkanmasına gerek olmadığını kontrol etmek için bir koşula sahiptir.

  • Araba temizse, cilala.

  • Temiz değilse, önce arabayı yıkayın, ardından kurulayın ve sonra cilalayın

.

Dolayısıyla, işlevsellik, yeni bir işlevsellik ekleyerek veya tamamen farklı bir şey yaparak geçersiz kılındı.


1
Cevap bu olmalı. +
Jack

9
  • Aşırı yükleme = Birden çok yöntem imzası, aynı yöntem adı
  • Geçersiz kılma = Aynı yöntem imzası (sanal olarak bildirilmiş), alt sınıflarda uygulanan

Zeki bir görüşmeci şunları takip ederdi:

Geçersiz kılma ve gölgeleme arasındaki fark nedir?


Buna gölge denildiğini hiç bilmiyordum, bilmek güzel. Aşırı yükleme ve geçersiz kılma arasındaki tek ilişki aşmaktır.
Samuel

4

Michael'ın dediği gibi:

  • Aşırı yükleme = Birden çok yöntem imzası, aynı yöntem adı
  • Geçersiz kılma = Aynı yöntem imzası (sanal olarak bildirilmiş), alt sınıflarda uygulanan

ve

  • Shadowing = DerivedClass olarak değerlendirilirse türetilmiş yöntemi kullanır, BaseClass olarak ise temel yöntemi kullanır.

3

Aynı isimde ancak farklı parametrelere sahip birden fazla yönteme / kurucuya sahip olmak aşırı yükleme olarak adlandırılır. Bu bir derleme zamanı olayıdır.

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

Geçersiz kılma bir çalışma zamanı olayıdır, yani kodunuza bağlı olarak çıktı çalışma zamanında değişir.

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);
    }
}

Her iki sınıfta da topSpeed ​​() ortak bir yöntem olduğuna dikkat edin. Bir Ferrari'yi somutlaştırdığımız için farklı bir sonuç alıyoruz.

O / p:

Top speed for this car is: 400

2

C # 'da geçersiz kılma yönteminde anahtar sözcük geçersiz kılma olmadan gizli geçersiz kılma gibi bir Java yoktur ! şu C # uygulamalarına bakın:

geçersiz kılma olmadan varyant 1 : sonuç 200'dür

    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();
    }

geçersiz kılma anahtar kelimeli varyant 2 : sonuç 400'dür

    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();
    }

Virtual on Car sınıfı anahtar sözcüğü Java'da finalin tam tersidir, son anlamına gelmez , geçersiz kılabilirsiniz veya Car soyutsa uygulayabilirsiniz


1

shadowing = türetilmiş sınıfta iki tanımı tutar ve temel sınıf tanımını yansıtmak için türetilmiş sınıf tanımını gölgeler (gizler) ve bunun tersi de geçerlidir.


1

Eklenecek başka bir nokta.

Aynı ada sahip birden fazla yöntemle aşırı yükleme . Aynı veya farklı dönüş türü. Farklı parametre sayısı veya Farklı parametre türleri. Aynı Sınıfta veya Türetilmiş Sınıfta.

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)

Aynı sınıfta veya türetilmiş sınıfta mümkün olabilir. Genellikle aynı sınıfı tercih eder. Örneğin Console.WriteLine () 19 adet aşırı yüklenmiş metoda sahiptir.

Sınıf yapıcılarını, yöntemleri aşırı yükleyebilir.

Derleme Süresi (statik / Erken Bağlanma) polimorfizmi olarak kabul edilebilir.

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

Aynı sınıfta geçersiz kılma mümkün olamaz. Sınıf yöntemlerini, özellikleri, dizinleyicileri, olayları geçersiz kılabilir.

Geçersiz kılınan temel yöntem sanal, soyut veya geçersiz kılma gibi bazı sınırlamalara sahiptir. Bir geçersiz kılma yöntemini değiştirmek için yeni, statik veya sanal değiştiricileri kullanamazsınız.

Çalışma Süresi (Dinamik / Geç Bağlama) polimorfizmi olarak düşünülebilir.

Http://msdn.microsoft.com/en-us/library/6fawty39.aspx sürüm oluşturmaya yardımcı olur

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

Faydalı Bağlantılar

http://msdn.microsoft.com/en-us/library/ms173152.aspx Derleme zamanı polimorfizmi ve çalışma zamanı polimorfizmi


İhtiyaç duyulan ayrıntılarla iyi bir tane.
user3885927

1

Aşırı yükleme , statik polimorfizmin bir parçasıdır ve aynı isimde ancak farklı imzalara sahip farklı yöntemi uygulamak için kullanılır. Geçersiz kılma , eksik yöntemi tamamlamak için kullanılır. Bence bu iki kavram arasında bir karşılaştırma yok, benzer olan tek şey ikisinin de bitmiş olan aynı kelime dağarcığıyla gelmesi.


Kaptan burada: Bir yöntemin aşırı yüklenmesi, size aynı ada sahip farklı yöntemlerin birden çok imzasını verir. Geçersiz kılma, devralınan bir üyeyi sınıflardan veya arabirimlerden gizler. uzaklaşıyor
SparK

1
@SparK Geçersiz Kılma üyeyi gizlemez. Sen edebilir ya geçersiz ya Kalıtsal üyesini gizler. İkisi birbirini dışlayan seçeneklerdir.
2016

@Servy, yanlış kelime seçimi, "ikame" demek istedim.
SparK

0

Yöntem aşırı yükleme ve Yöntemi geçersiz kılma, tamamen farklı 2 farklı kavramdır. Yöntem aşırı yüklemesi aynı yöntem adına ancak farklı imzalara sahip. Yöntemi geçersiz kılma, türetilmiş sınıfta temel sınıf yönteminin varsayılan uygulamasını değiştiriyor. Aşağıda, bu kavramları açıklayan 2 mükemmel eğitim videosu bulabilirsiniz.

Vs gizlemeyi geçersiz kılan yöntem

Yöntem aşırı yükleme


0

Aşırı yükleme, aynı imzalara veya aynı ada sahip ancak farklı parametrelere ve geçersiz kılma yöntemlerine sahip olduğunuz kavramdır, farklı parametrelerle aynı ad yöntemlerine sahibiz, ayrıca kalıtım da geçersiz kılma olarak bilinir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.