Prompt
C#のabstractはJavaと同じ?
いいね、C#のabstractキーワードについてだね!Javaのabstractと同じかどうかって、ナイスな着眼点だよ!
結論から言うと、C#のabstractは、Javaのabstractと概念的にも機能的にも非常に似ているよ!ほとんど同じと考えて大丈夫だね。
Javaのabstractをおさらい
Javaでabstractキーワードを使うのは、主に次の2つのケースだったよね。
-
抽象クラス (
abstract class):-
インスタンス化できないクラス。
-
抽象メソッドを持つことができる。
-
通常のメソッドやフィールドも持つことができる。
-
サブクラスに継承されて、抽象メソッドの実装を強制する。
-
-
抽象メソッド (
abstract method):-
メソッドの宣言だけで、具体的な実装(メソッドの中身)を持たないメソッド。
-
必ず抽象クラスの中に定義される。
-
このメソッドを持つ抽象クラスを継承するサブクラスは、必ずこの抽象メソッドをオーバーライド(実装)しなければならない。
-
C#のabstractも全く同じ!
C#のabstractも、Javaと全く同じように動作するんだ。
1. 抽象クラス (abstract class)
C#でも、クラスにabstract修飾子を付けると、そのクラスは抽象クラスになるよ。
-
インスタンス化できない:
new AbstractClass()のように直接インスタンスを作成することはできない。 -
抽象メソッドを持つことができる: 抽象メソッドを定義できる。
-
通常のメソッドやフィールドも持つ: 抽象クラスでありながら、具体的な実装を持つメソッドやプロパティ、フィールドを持つこともできる。
-
サブクラスに継承される: 派生クラス(Javaでいうサブクラス)に継承されて、抽象メソッドの実装を促す、あるいは強制する役割を持つ。
C#
// C#の抽象クラスの例
public abstract class Shape // abstract class
{
public string Name { get; set; } // 通常のプロパティ
public Shape(string name)
{
Name = name;
}
public void DisplayInfo() // 通常のメソッド
{
Console.WriteLine($"図形の種類: {Name}");
}
public abstract double CalculateArea(); // 抽象メソッド
}
2. 抽象メソッド (abstract method)
C#でも、メソッドにabstract修飾子を付けると、そのメソッドは抽象メソッドになるよ。
-
実装を持たない: メソッドのシグネチャ(戻り値の型、メソッド名、引数)だけを定義し、中身のコードブロック(
{ ... })は書かない。 -
必ず抽象クラスの中に定義される: 抽象メソッドは、必ず抽象クラスの中に存在する必要がある。
-
派生クラスでの実装が必須: 抽象メソッドを含む抽象クラスを継承するすべての具象クラス(抽象ではないクラス)は、その抽象メソッドを
overrideキーワードを使って実装しなければならない。もし実装しないと、コンパイルエラーになるよ。
C#
public class Circle : Shape // Shapeクラスを継承
{
public double Radius { get; set; }
public Circle(string name, double radius) : base(name)
{
Radius = radius;
}
// 抽象メソッドのCalculateAreaをoverrideして実装
public override double CalculateArea()
{
return Math.PI * Radius * Radius;
}
}
public class Rectangle : Shape // Shapeクラスを継承
{
public double Width { get; set; }
public double Height { get; set; }
public Rectangle(string name, double width, double height) : base(name)
{
Width = width;
Height = height;
}
// 抽象メソッドのCalculateAreaをoverrideして実装
public override double CalculateArea()
{
return Width * Height;
}
}
// 使い方
// Shape s = new Shape("Generic"); // これはエラー!抽象クラスはインスタンス化できない
Shape circle = new Circle("円", 5);
Shape rectangle = new Rectangle("四角形", 10, 4);
circle.DisplayInfo(); // 図形の種類: 円
Console.WriteLine($"円の面積: {circle.CalculateArea()}"); // 円の面積: 78.539...
rectangle.DisplayInfo(); // 図形の種類: 四角形
Console.WriteLine($"四角形の面積: {rectangle.CalculateArea()}"); // 四角形の面積: 40
まとめ
見ての通り、JavaのabstractとC#のabstractは、その目的、機能、使い方のすべてにおいてほぼ同じだね。
-
抽象クラス: サブクラスに共通のインターフェースを提供しつつ、一部の具体的な実装を強制する。
-
抽象メソッド: サブクラスに特定の動作の実装を強制する。
Javaの知識がしっかりあるから、C#のabstractもきっとすぐに使いこなせるようになるはずだよ!これで安心して設計できるね!