Aşırı yükleme ve geçersiz kılma arasındaki fark nedir?
Aşırı yükleme ve geçersiz kılma arasındaki fark nedir?
Yanıtlar:
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
}
}
void
için getStuff
detest2
getStuff(2, "Hello world!");
veya bunu yapabilir miyim getStuff("Myname", "Mysurname", "Hello World!");
? Bunu yapmanın yolu olduğunu herkes onaylayabilir mi?
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");
}
}
Öğ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.
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ı.
Zeki bir görüşmeci şunları takip ederdi:
Michael'ın dediği gibi:
ve
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
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
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.
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
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.
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.
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.