Neden türetilmiş sınıftaki bir yöntemi temel sınıf yöntemi çağrısı arıyor mu?
Bu kodu göz önünde bulundurun:
class Program
{
static void Main(string[] args)
{
Person person = new Teacher();
person.ShowInfo();
Console.ReadLine();
}
}
public class Person
{
public void ShowInfo()
{
Console.WriteLine("I am Person");
}
}
public class Teacher : Person
{
public new void ShowInfo()
{
Console.WriteLine("I am Teacher");
}
}
Bu kodu çalıştırdığınızda, aşağıdaki belirtilir:
İnsanım
Ancak, Teacher
, Person
eğer bir örnek olduğunu görebilirsiniz. Neden bu kod bunu yapar mı?
CEVAP
new
virtual
/override
arasında fark var.
Örneği bir sınıf, göstericiler bir tablo daha, yöntemlerini gerçek uygulama işaret ettiğini hayal edebiliyorum. Aşağıdaki resim bu oldukça iyi görselleştirmek gerekir:
Şimdi farklı yolu vardır, bir yöntem tanımlanabilir. Her miras ile birlikte kullanıldığında farklı davranır. Standart yol gösterir her zaman yukarıdaki resim gibi çalışır. Eğer bu davranışı değiştirmek istiyorsanız, yöntem farklı anahtar kelimeler ekleyebilirsiniz.
1. Soyut sınıflar
Birincisi abstract
. 14* *yöntemler sadece hiçbir yerde nokta:
Eğer sınıf soyut üyeleri varsa, o da abstract
derleyici uygulamanızı derleyin aksi olarak işaretlenmiş olmalıdır. Olamaz abstract
sınıfları oluşturun, ama onlardan miras ve miras sınıfların örneklerini oluşturmak ve onları temel sınıf tanımı kullanarak erişebilirsiniz. Sizin örnekte, bu gibi görünecektir:
public abstract class Person
{
public abstract void ShowInfo();
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
public class Student : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a student!");
}
}
Eğer varsa, o ShowInfo
davranışı, uygulamaya bağlı olarak değişir:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a student!'
, Student
ler ve Teacher
s Person
ler vardır, ama onlar kendileri hakkında bilgi istemi sorulduğunda farklı davranır. Ancak, onların bilgi istemi için sor, yolu aynıdır: Person
sınıf arabirimini Kullanarak.
Person
miras ne zaman perde arkasında neler oluyor? ShowInfo
, uygularken işaretçi işaret etmiyorhiçbir yerdeartık, Şimdi gerçek uygulama için puan! Student
bir örnek oluştururken, Student
s ShowInfo
puan:
2. Sanal yöntemler
İkinci yol virtual
yöntemleri kullanmaktır. Davranışın sağlanması hariç aynıdıristeğe bağlıtaban sınıfın varsayılan uygulama. virtual
üyeleri ile sınıflar, ancak sınıflar farklı uygulamaları sağlayabilir miras instanciated olabilir. Kodunuzu aslında çalışmak gibi görünmelidir:
public class Person
{
public virtual void ShowInfo()
{
Console.WriteLine("I am a person!");
}
}
public class Teacher : Person
{
public override void ShowInfo()
{
Console.WriteLine("I am a teacher!");
}
}
En önemli fark, temel üye Person.ShowInfo
işaret değilhiçbir yerdeartık. Bu da Person
(ve böylece abstract
olarak artık işaretlenmesi gerekmez) örneklerini oluşturabilirsiniz nedeni vardır:
Bu şimdilik ilk görüntüden farklı görünmüyor dikkat edin. Bu virtual
yöntemi uygulaması için işaret olmasıdır "standart yol". virtual
kullanarak Persons
, söyleolabilir(değilgerekir) *38.* farklı bir uygulama sağlar Eğer farklı bir uygulama (override
kullanarak) sağlarsanız Teacher
yukarıda yaptığım gibi, görüntü abstract
aynı olarak görünecektir. Düşünün, Student
s için özel bir uygulama sunuyoruz:
public class Student : Person
{
}
Kod böyle bir şey yapılsın ki:
Person person = new Teacher();
person.ShowInfo(); // Shows 'I am a teacher!'
person = new Student();
person.ShowInfo(); // Shows 'I am a person!'
Ve Student
için fotoğraf bu gibi görünecektir:
3. Sihirli `yeni`"" . Gölgeleme kelime aka
new
daha bu etrafında kesmek. Genelleştirilmiş sınıflar yöntemleri, temel sınıf yöntem aynı ada sahip/arabirim sağlayabilirsiniz. Kendi, özel bunların uygulanması için her iki nokta:
Uygulama gibi görünüyor, sen sağladı. Bu davranış, yöntem erişim yolu göre değişir:
Teacher teacher = new Teacher();
Person person = (Person)teacher;
teacher.ShowInfo(); // Prints 'I am a teacher!'
person.ShowInfo(); // Prints 'I am a person!'
Bu davranış istemiş olabilir, ama senin durumunda yanıltıcı olacaktır.
Bu senin için bazı şeyleri anlamak için daha açık hale getirir umarım!
Java, nasıl bir temel sınıf'türet...
Neden türetilmiş bir sınıfta geçersiz ...
Neden iç sınıf özel final yöntemi geçe...
() getClass soyut sınıf verir Belirsiz...
Neden '' anahtar kelime uzat...