does not implement inherited abstract member の原因と直し方
abstractなメンバーを持つ基底クラスを継承したのに、そのメンバーをoverrideしていないと出るコンパイルエラーです。
エラーメッセージの読み方
Program.cs(4,7): error CS0534: 'Circle' does not implement inherited abstract member 'Shape.Area()'
Program.cs- ファイル名
4- 行番号
7- 列番号 — この位置でコンパイラが解析に失敗しました
CS0534- エラーコード — 検索するとMicrosoftの解説ページが見つかります
'Circle' does not implement inherited abstract member 'Shape.Area()'- 内容 — 期待していたもの、または受け付けられなかったもの
このエラーが出る典型パターン
パターン1
1 abstract class Shape { 2 public abstract double Area(); 3 } 4 class Circle : Shape { 5 public double Radius; 6 ^ 7 } 8 class Program { 9 static void Main(string[] args) { 10 Circle c = new Circle { Radius = 2 }; 11 System.Console.WriteLine(c.Area()); 12 } 13 }
Program.cs(4,7): error CS0534: 'Circle' does not implement inherited abstract member 'Shape.Area()'
abstractなメンバーは、派生クラスで必ずoverrideして実装しなければなりません。1つでも忘れるとそのクラスはインスタンス化できません。
直し方: (空) を public override double Area() { return 3.14 * Radius * Radius; } にします。
広告
広告スロット(未設定)
パターン2
1 abstract class Vehicle { 2 public abstract void Drive(); 3 } 4 class Car : Vehicle { 5 ^ 6 } 7 class Program { 8 static void Main(string[] args) { 9 Car c = new Car(); 10 c.Drive(); 11 } 12 }
Program.cs(4,7): error CS0534: 'Car' does not implement inherited abstract member 'Vehicle.Drive()'
publicかoverrideのどちらかが欠けても、抽象メンバーの実装としては認められません。
直し方: (空) を public override void Drive() { System.Console.WriteLine("Driving"); } にします。
パターン3
1 abstract class Employee { 2 public abstract decimal CalculatePay(); 3 } 4 class Manager : Employee { 5 ^ 6 } 7 class Program { 8 static void Main(string[] args) { 9 Manager m = new Manager(); 10 System.Console.WriteLine(m.CalculatePay()); 11 } 12 }
Program.cs(4,7): error CS0534: 'Manager' does not implement inherited abstract member 'Employee.CalculatePay()'
戻り値の型(ここではdecimal)も基底クラスの宣言と完全に一致させる必要があります。
直し方: (空) を public override decimal CalculatePay() { return 5000; } にします。
よくある誤解
interface-not-implementedと似ていますが、こちらはabstract classの話です。publicとoverrideの両方が揃って初めて「実装した」とみなされます。
まとめ
does not implement inherited abstract memberは上級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。