SORU
18 Temmuz 2013, PERŞEMBE


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
18 Temmuz 2013, PERŞEMBE


new virtual/overridearası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:

Illustration of method implementations

Ş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:

Illustration of abstract classes

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!'

, Studentler ve Teachers Personler 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, Students ShowInfo puan:

Illustration of inherited methods

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:

Illustration of a virtual member inside a base class

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, Students 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:

Illustration of the default implementation of a method, using virtual-keyword

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:

Illustration of the "way around" using the new-keyword

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!

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Kiddyzuzaa

    Kiddyzuzaa

    25 ŞUBAT 2014
  • RogerBuckChrist

    RogerBuckChr

    9 Temmuz 2011
  • ThreadBanger

    ThreadBanger

    2 Mart 2007