前提
ハーバート・シルト著「独習C# 第3版」で独習しています。
章末の練習問題の解答例に疑問を感じ質問します。
設題はこうです。
p361 第9章理解度チェック 第6問
次に示すVehicleクラスのインターフェースを作成しなさい。
(ヒント)このでのプロパティは読み取りと書き込みが可能である必要があります。インターフェイスのプロパティには、アクセス修飾子をつけることができません。
C#
1 class Vehicle:IVehicle 2 { 3 // プロパティ 4 public int Passengers { get; protected set; } // 乗車定員 5 public int FuleCap { get; protected set; } // 燃料 6 public int Mpg { get; protected set; } // 燃費 7 8 // コンストラクタ 9 public Vehicle(int p, int f, int m) 10 { 11 this.Passengers = p; 12 this.FuleCap = f; 13 this.Mpg = m; 14 } 15 // メソッド 16 public int Range() 17 { 18 return this.FuleCap * this.Mpg; 19 } 20 21 public double FuelNeeded(int miles) 22 { 23 return (double)miles / this.Mpg; 24 } 25 }
解答例は次のとおりです。
C#
1 interface IVehicle 2 { 3 // プロパティ 4 int Passengers { get; set; } // 乗車定員 // Vehicleクラスのsetは、protectedのため setは削除 5 int FuleCap { get; set; } // 燃料 // 同上 6 int Mpg { get; set; } // 燃費 // 同上 7 // メソッド 8 int Range(); 9 double FuelNeeded(int miles); 10 }
発生している問題・エラーメッセージ
以上、二つのソースコードをコンパイラにかけると、次のようにエラーを発生します。
エラー CS0277 'Vehicle' はインターフェイス メンバー 'IVehicle.Passengers.set' を実装しません。 'Vehicle.Passengers.set' は public ではありません。
このエラーが発生理由は理解しています(インターフェイスはアクセス修飾子がpublicでなければならず、そのインターフェイスを継承するクラスなどもpublicで継承しなければならが、VehicleクラスがプロパティのPassengers、FuleCap、Mpgのsetアクセサのアクセス修飾子をprotectedにしているため)。
疑問点
このエラーを解消する方法は、いくつあるのでしょうか?
特にVehicleクラス側でprotectedの機能を生かした状態で、対処する方法はないでしょうか?
ご教示の程、よろしくお願いします。
試したこと
このエラーを解消するために私の試した方法は次の通り、IVehicleインターフェイス側のプロパティからsetアクセサを削除する方法です。
C#
1 interface IVehicle 2 { 3 // プロパティ 4 int Passengers { get; } // 乗車定員 // Vehicleクラスのsetは、protectedのため setは削除 5 int FuleCap { get; } // 燃料 // 同上 6 int Mpg { get; } // 燃費 // 同上 7 // メソッド 8 int Range(); 9 double FuelNeeded(int miles); 10 }
しかし、これをすると各プロパティに値をセットし忘れる恐れがあるから、あまりいい方法とわ思えません。
補足情報(FW/ツールのバージョンなど)
win8.1
Microsoft Visual Studio Community 2019 Version 16.3.9
Microsoft .NET Framework Version 4.7.2
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/16 07:30