![]()
Yerine koyma prensibide dediğimiz bu prensipte türeyen sınıfın üyeleri, temel sınıfın üyeleri ile tamamen yer değiştirebilir olmalıdır. Alt sınıflardan oluşan nesnelerin, üst sınıfın nesneleri ile yer değiştirdikleri zaman, aynı davranışı sergilemesi gerekmektedir. Yani bir alt sınıfı uygularsak, onu ana sınıf yerine de kullanabilmemiz gerekir. Aksi halde miras yanlış uygulanmış demektir.
Klasik örneklerden birini yapacağım. Dikdörtgen alanı hesaplama işlemi üzerinden bu prensibe bakalım. Önce kötü örnek;
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
//Bu üst sınıf olsun public class BadDikdortgen { public virtual int Height { get; set; } //virtual ovvaride edebilirsin public virtual int Width { get; set; } } public class BadKare: BadDikdortgen { int _height; int _width; public override int Height { get => _height; set => _height = value; } public override int Width { get => _width; set => _width = value; } } public class BadAreaCalculator { public static double CalculateArea(BadDikdortgen badDikdortgen) { return badDikdortgen.Height * badDikdortgen.Width; } public static double CalculateArea(BadKare badKare) { return badKare.Height * badKare.Width; } } |
Burada işlev aynı yani Hem Dikdörtgen hemde Kare de iki kenar çarpımı alanı verir ve bir birinin yerine geçebilir doğru ama hesaplama yanlış olacaktır.
Doğru bir dizayn üzerinden gidelim
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public abstract class Sekil { public int Id { get; set; } public int Edge { get; set; } } public class Dikdortgen: Sekil { public int Width { get; set; } public double DikdortgenAlan() { return Width * Edge; } } public class Kare: Sekil { public double KareAlan() { return Edge * Edge; } } |
Evet burda kendi yerlerine geçtiler fakat herbirinin kendi içerinde ayrı hesabı olduğu için yerine geçse bile işine engel olmadı yada yanlış iş(hesaplama) yapmadı.
Kaynak kodlarına adresten ulaşabilirsiniz.
Sağlıcakla kalın…








Bir yanıt yazın