En iyi yanıtlayıcılar
polymorphism hakkında bir soru

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";
}
}
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
- Düzenleyen Önay YALÇINERModerator 28 Kasım 2020 Cumartesi 19:07
- Yanıt Olarak Öneren Kyamuran SalibryamMicrosoft contingent staff, Moderator 1 Aralık 2020 Salı 01:08
- Yanıt Olarak İşaretleyen Kyamuran SalibryamMicrosoft contingent staff, Moderator 8 Aralık 2020 Salı 20:19
Tüm 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
- Düzenleyen Önay YALÇINERModerator 28 Kasım 2020 Cumartesi 19:07
- Yanıt Olarak Öneren Kyamuran SalibryamMicrosoft contingent staff, Moderator 1 Aralık 2020 Salı 01:08
- Yanıt Olarak İşaretleyen Kyamuran SalibryamMicrosoft contingent staff, Moderator 8 Aralık 2020 Salı 20:19
-
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.