Code Fix

上級

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パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)