2016-03-21 25 views
1

Java ve C# sınıflarında alanların fazla çalışmadığını (ancak yöntemlerin) bilmiyorum. Bu gerçeği biliyorum, ancak böyle bir uygulamada nedenini anlayamıyorum. Tahmin edilebilir ve açık değildir. Neden böyle bir OOP uygulaması var?Sınıf alanları neden geçersiz kılmıyor

public class Flight { 
    int seats = 150; 
} 

public class CargoFlight extends Flight { 
    int seats = 12; 
} 

CargoFlight f1 = new CargoFlight(); 
System.out.println(f1.seats); 

Flight f2 = new CargoFlight(); 
System.out.println(f2.seats); 

Ve:

class Flight 
{ 
    public int Seats = 150;  
} 

class CargoFlight : Flight 
{ 
    public int Seats = 20; 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     CargoFlight f1 = new CargoFlight(); 
     Console.WriteLine(f1.Seats); 

     Flight f2 = new CargoFlight(); 
     Console.WriteLine(f2.Seats);    

     Console.ReadLine(); 
    } 
} 
+4

Geçersiz kılma * davranış *, * durumu * konusunda uzmanlaşmaya yöneliktir. İki değişkeni ayrı ayrı ilan etmek garip olurdu ama sadece bir parça devlet IMO ile bitti. Gerçekten aradığınız şey, mevcut duruma bir * atama * ve kolayca başarılabilir. –

+0

bu nasıl geçersiz kılıyor? sadece yeni değerler atarız ..... genellikle davranışları geçersiz kılar, çünkü birçok kez türetilmiş sınıf için fark davranışını istiyoruz ... davranışları sınıftaki yöntemlerle ilişkilendirebilirsiniz ... – Viru

+0

'sadece yeni değerler atamak' - Yapıyoruz. * 2 farklı alan ilan ediyorsun, biri diğerini gölgeliyor. İsterseniz yeni bir değer atayabilirsiniz. Bunu durdurmak için hiçbir şey yok. – sisyphus

cevap

2

Bu diller cepten dayanır ve cepten çok gerçek dünya kavramları etkilendiğini belirtildiği gibi. Gerçek bir dünya örneğinden: Eğer bir çocuk, ebeveynden bir şey miras alırsa, ebeveynini (daha fazla servet ekleyerek geçersiz kılmadığı mülk, zenginlik vb.) Miras alır, ancak ebeveynlerinin davranışlarını geçersiz kılabilir. (nasıl konuştuğunu, yürüdüğünü, anladığını vb.).

Benzer şekilde, bir sınıf devraldığında programlamada, hem durum hem de davranışı üst öğeden devralır. Ancak bunu kullanabilse de, ebeveynin durumunu keyfi olarak geçersiz kılmaz. Çocuk sınıfının ebeveynlerin davranışlarını (yöntemleri) geçersiz kılma konusunda özgürlükleri vardır.

0

Evet, bu biçimde, gerçekten dehşet verici görünebilir, ancak dilin nasıl çalıştığını düşünmek biraz yardımcı olur.

Örneğin çoğu zaman, sınıf nesnesine toString yöntemini atadığımız halde, üst sınıf nesnesini (hepsini yöneten kişi!) Bizi mutlu bir şekilde kullanabilmemize rağmen. Ancak Object'in toString-metodunun çoğu zaman bizim amacımıza uygun değildir ve sınıfımız için çok daha iyi olan farklı bir toString-metodu yazıyoruz.

Bu, kodunuzda örneklerinizdeki gibi açıkça gösterilmese de, aslında tüm dil nasıl çalışır; alt sınıflar ana sınıf yöntemlerini devralırlar ve eğer amaç için kendileri için işe yaramıyorsa, sınıfın amaçları için daha iyi uyum sağlamaları için geçersiz kılınırlar. Derslerde, kendimizi yazıyor olduğumuz derslerden çok daha açık IMO'lar.

Elbette sınıflarınızı kendi sınıflarınızı geçersiz kılma gereği olmadan planlamaya çalışabilirsiniz, ancak üst sınıfın bazı genel yöntemleri tanımlamasına ve sonra gerektiğinde bunları daha spesifik tanımlamasına izin vermek çok daha verimlidir. .

İlgili konular