2016-03-21 18 views
1

JavaクラスとC#クラスでは、フィールドがオーバーランではないことがわかりましたが、メソッドではそうです。私はその事実を知っていますが、そのような実装の理由は何か分かりません。それは予測可能で明白ではありません。なぜ私たちはOOPのそのような実装を持っていますか?クラスフィールドがオーバーライドされない理由

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

そして:

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

オーバーライドは、* state *ではなく* behavior *を特化するためのものです。 2つの変数を別々に宣言するのは変わりますが、1つの状態IMOで終わるのは変です。あなたが本当に探しているのは、既存の州への割り当てです。これは簡単に達成できます。 –

+0

これはどのように上書きされますか?あなたは単に新しい値を割り当てているだけです...私たちは一般に、派生クラスのdiff動作をしたいので、ビヘイビアをオーバーライドします...クラスのメソッドにビヘイビアを関連付けることができます... – Viru

+0

'新しい値を割り当てるだけです。あなたはやっている。あなたは* 2つの異なるフィールドを宣言しています。必要に応じて、新しい値を割り当てることができます。それを止めるものは何もありません。 – sisyphus

答えて

2

あなたはこれらの言語はOOP基づいており、OOPは非常に現実世界の概念の影響を受けていることを述べたように。現実世界の例から:子供が親から何かを継承した場合、親の状態(富を増やすことによって上書きできない財産、富など)を継承しますが、親の行動を上書きすることができます(彼/彼女は話す、歩く、理解するなど)。

同様に、クラスが継承するときのプログラミングでは、親から状態と動作の両方を継承します。しかし、それはそれを使用することはできますが、親の状態を任意に上書きすることはできません。子クラスには、親の動作(メソッド)をオーバーライドする自由があります。

0

はい、その形式では、実際には見慣れないように見えますが、言語がどのように機能しているかを考えても少しは役に立ちます。

例えば、私たちは親クラスObject(それをすべて支配するもの)を喜んで使うことができるにもかかわらず、クラス固有のtoStringメソッドを割り当てています。しかし、ほとんどの場合、ObjectのtoStringメソッドは実際には私たちの目的に合っておらず、クラスに対してはるかに良いtoStringメソッドの別のものを記述します。

これは例のようにコードではっきりと示されていませんが、言語全体が実際にどのように機能しているかは実際にはわかりますが、サブクラスは親クラスのメソッドを継承しますが、意図したとおりに実際には機能しない場合は、クラスの目的に合わせて上書きされます。私たちが自分の書いている授業では、授業の授業を使うときよりもはるかに明確なIMOです。

もちろん、独自のクラスをオーバーライドする必要はありませんが、親クラスにいくつかの一般的なメソッドを定義させ、必要に応じてより具体的に定義できるようにすることができます。

関連する問題