none
polymorphism hakkında bir soru RRS feed

  • Soru

  • merhabalar 
    öncelikle böyle basit sorları sorduğum için kusura bakmayın. ancak konuyu kavramam gerekiyor. 
    polymorphism konusunda temel sınıfta bir metot oluşturup bu metota "virtual" anahtar kelimesi ile metotu ezme işlemi uyguladığımızda eğer bir başka sınıftan bu metota erişildiğinde temel sınıftaki metot olduğu gibi çalışacak. bu metotu bir başka örneğin "öğrenci" sınıfında aynı isimle "overlide" anahtar sözcüğü ile yeniden mi tanımlamamız gerekiyor? yoksa bu metota form1'den erişirken bu metotu burada ezebiliyor muyuz? bu sorularıma cevap verebilir msiniz? birrde biraz bilgi istiyorum.
    teşekkürler. 

    class insan
        {
            public string  adi{ get; set; }
            public string soyadi{ get; set; }
            public DateTime dogumtarihi{ get; set; }

            public virtual string goster()
            {
                return "adı ve soyadı boş";
                }
        }

    class ogrenci : insan
        {
            public override string goster()
            {
                return "öğenci sınıfından türüyor";
            }
        }

    28 Kasım 2020 Cumartesi 09:43

Yanıtlar

  • Tam sorunu anlamadım ama insan classını abstract yapmalısın böylece

    var i = new insan();

    yapılmasını engellemiş olursun. Eğer her insan dan miras alan class içinde de göster methodu olmasını sağlamak için methodu abstract yapmalısın;

    abstract class İnsan  //Türkilizce yazmana gerek yok, Türkçe karakter kullanabilirsin C# unicode bir dildir.
    {
      public string Adı{ get; set; }
      public string Soyadı{ get; set; }
      public DateTime DoğumTarihi{ get; set; }
      public abstract string Göster();
    }

    böylece bundan instance aldığın tüm classlarda Göster methodunun override'ını mecburi kılmış oldun.

    Eğer bir methodun hem atasındaki hemde miras classtaki kodların çalışmasını istiyorsan base keywordunu kullanmalısın.

    class class1 {
    
       private int _sayı = 0;
       public int Sayı => _sayı;
    
       public virtual void Method1(){
          _sayı++;
       }
    }
    
    class class2 : class1 {
    
       public override void Method1(){
          //bıdı bıdı ...
          base.Method1();
       }
    }
    
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    28 Kasım 2020 Cumartesi 18:49
    Moderatör

Tüm Yanıtlar

  • merhaba

    bu soruma ceva verebilecek kimse yok mu acaba?

    28 Kasım 2020 Cumartesi 17:11
  • Tam sorunu anlamadım ama insan classını abstract yapmalısın böylece

    var i = new insan();

    yapılmasını engellemiş olursun. Eğer her insan dan miras alan class içinde de göster methodu olmasını sağlamak için methodu abstract yapmalısın;

    abstract class İnsan  //Türkilizce yazmana gerek yok, Türkçe karakter kullanabilirsin C# unicode bir dildir.
    {
      public string Adı{ get; set; }
      public string Soyadı{ get; set; }
      public DateTime DoğumTarihi{ get; set; }
      public abstract string Göster();
    }

    böylece bundan instance aldığın tüm classlarda Göster methodunun override'ını mecburi kılmış oldun.

    Eğer bir methodun hem atasındaki hemde miras classtaki kodların çalışmasını istiyorsan base keywordunu kullanmalısın.

    class class1 {
    
       private int _sayı = 0;
       public int Sayı => _sayı;
    
       public virtual void Method1(){
          _sayı++;
       }
    }
    
    class class2 : class1 {
    
       public override void Method1(){
          //bıdı bıdı ...
          base.Method1();
       }
    }
    
    


    e-mail: onay[nokta]yalciner[at]hotmail[nokta]com



    28 Kasım 2020 Cumartesi 18:49
    Moderatör
  • Polymorhism biraz genel bir ifade olmuş. Zira polymorhism çok çok geniş bir yelpaze. Cevaba gelince, şayet bir fonksiyon alt sınıflarda aynen kullanılabilecek durumdaysa ancak bazı alt sınıfların bunu değiştirmesi veya bununla birlikte başka biçimde davranması bekleniyorsa ilgili fonksiyon virtual olarak işaretlenir. Override işlemi ise(sizin tabirinizle "ezme") ancak alt sınıflarda yapılabilir. Hatta alt sınıftan türeyen diğer sınıflar da override edilmiş işlevi override edebilir. (Bakmakta fayda var: sealed override) Yani, form1 ile insan-öğrenci sınıfları arasında herhangi bir kalıtım bağı yoksa goster() fonksiyonunu form1 tarafında override edemezsiniz.
    30 Kasım 2020 Pazartesi 20:47