2016-03-21 15 views
1

Ich weiß, dass in Java und C# -Klassen die Felder nicht überschrieben werden (aber die Methoden tun). Ich weiß diese Tatsache, aber ich verstehe nicht, was der Grund für eine solche Implementierung ist. Es ist nicht vorhersehbar und offensichtlich. Warum haben wir eine solche Implementierung von OOP?Warum Klassenfelder nicht überschrieben werden

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); 

Und:

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

Overriding ist für die Spezialisierung * Verhalten *, nicht * State * bestimmt. Es wäre komisch, zwei Variablen separat zu deklarieren, aber nur mit einem Stück Staat, IMO, zu enden. Was Sie wirklich suchen, ist eine * Zuweisung * zum bestehenden Zustand, und das ist leicht zu erreichen. –

+0

Wie ist das Überschreiben ?? Sie vergeben nur neue Werte ..... wir überschreiben normalerweise Verhalten, weil wir oft Diff-Verhalten für abgeleitete Klassen wollen ... Sie können Verhalten mit Methoden in Klasse verknüpfen ... – Viru

+0

'nur neue Werte zuweisen' - das ist nicht was Sie gehen. Sie * deklarieren * 2 verschiedene Felder, eines schattiert das andere. Wenn Sie möchten, können Sie einen neuen Wert zuweisen. Da gibt es nichts zu stoppen. – sisyphus

Antwort

2

Wie Sie, dass diese Sprachen erwähnt werden OOP basiert und OOP ist sehr stark von der realen Welt Konzepte beeinflusst. Aus einem Beispiel aus der realen Welt: Wenn ein Kind etwas von seinem Elternteil erbt, erbt es den Status des Elternteils (Eigentum, Vermögen usw., den er nicht überschreiben kann, indem er mehr Wohlstand hinzufügt), aber er/sie kann das Verhalten seines Elternteils außer Kraft setzen (wie er/sie spricht, geht, versteht usw.).

In ähnlicher Weise erbt in der Programmierung, wenn eine Klasse erbt, er beide Status und Verhalten von Parent. Aber es kann den Zustand des Elternteils nicht willkürlich überschreiben, obwohl er es benutzen kann. Und die Kindklasse hat die Freiheit, das Verhalten der Eltern (Methoden) zu überschreiben.

0

Ja, in diesem Format kann es wirklich desorientierend aussehen, aber zu denken, wie die Sprache funktioniert, hilft ein bisschen.

Zum Beispiel weisen wir meistens die klassenspezifische toString-Methode zu, obwohl wir genauso gut die eine verwenden könnten, die die Elternklasse (das Objekt, das sie alle beherrscht!) Für uns definiert hat. Die meiste Zeit ist die toString-Methode von Object nicht wirklich für unsere Zwecke geeignet und wir schreiben eine andere toString-Methode, die für unsere Klasse besser geeignet ist.

Während dies in Code nicht so deutlich wie in Ihren Beispielen gezeigt wird, ist es so, wie die ganze Sprache tatsächlich funktioniert; Unterklassen erben die Methoden der Elternklassen, und wenn sie nicht wie vorgesehen für sie funktionieren, werden sie überschrieben, um besser für die Zwecke der Klasse zu passen. Es ist viel klarer IMO in Klassen, die wir selbst schreiben, als wenn wir vorhandene Klassen verwenden.

Natürlich könnten Sie versuchen, Ihre Klassen so zu planen, wie Sie Ihre eigenen Klassen nicht überschreiben müssen, aber es ist viel effizienter, die Elternklasse einige generische Methoden definieren zu lassen und sie dann spezifischer zu definieren, falls/wenn nötig .

Verwandte Themen