2012-04-21 14 views
0

を使用すると、このクラス図を検討しながら、コードの重複を避けるためにしよう:設計上の問題:Consts

enter image description here

車は200キロの定数最高速度、およびバス100キロを持っています。私はこれをサブクラスのconst maxSpeedフィールドとして表します。

getMaxSpeed()はどのようにしてこの定数を返しますか?これは私の問題を説明するための単純な例であるため、getMaxSpeed()をすべてのサブクラスに複製しても私は役に立ちません。

これを行う方法はありますか?

私は既にconstを避けて仮想プロパティを使うという解決法を考えましたが、クラスのすべてのインスタンスはmaxSpeedフィールドを保持します。これはスペースの無駄です。

+4

仮想プロパティのフィールドは必要ありません。単にそれを 'virtual int MaxSpeed {get {return 200; }} ' – knittl

+0

そうです。それはソリューションのようなにおいがしますが、関数呼び出しがあります。私はコンパイラに私のためにこれらの数値を移植させるためにconstを欲しかった – wolfovercats

+0

'const'を望むならば、それは仮想にすることはできません。コンパイラが派生クラスから定数をインライン化する方法はありません。 – Gabe

答えて

2

何かを仮想にするのは、コンパイル時にどのメソッドを呼び出すのか分からないので、constvirtualにすることはできません。これに対する典型的な解決方法は、基底クラスにabstract public double MaxSpeed { get; }を入れてから派生クラスのoverride public double MaxSpeed { get { return 200; } }にすることです。

このソリューションは、まだ自身の最大値を持っているすべての車両を可能にしながら、洗練されたJITコンパイラは、Vehicleの特定のインスタンスが常にCarであると判断し、(あなたが望んでいたとして)get_MaxSpeedメソッド呼び出しをインライン化できるようにすることができます速度。