virtual/override/sealedとabstractクラス
virtualメソッド、オーバーライド、オーバーライドのsealed、abstractクラスを学びます。基底クラス型の参照から派生クラスの実装へディスパッチされる仕組みも確認します。
「virtual/override/sealedとabstractクラス」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
継承の基本
目標:継承によって動作を再利用し、カスタマイズします。
- 基底クラスではvirtualを使用します
- 派生クラスではoverrideを使用します
- さらなる変更を止めるにはsealed overrideを使用します
- abstract classは契約と共有コードを定義します
virtual と override
virtualによってオーバーライドが可能になります。基底クラスの参照を通じた呼び出しでは、派生クラスの override が使用されます(動的ディスパッチ)。
using System;
// Base method is virtual so derived classes can customize it
public class Shape
{
public virtual double Area()
{
return 0.0; // default
}
}
public class Rectangle : Shape
{
public int Width { get; private set; }
public int Height { get; private set; }
public Rectangle(int w, int h)
{
Width = w; Height = h;
}
public override double Area()
{
return Width * Height;
}
}
public class Program
{
public static void Main(string[] args)
{
Shape s = new Shape();
Shape r = new Rectangle(3, 4); // base reference
Console.WriteLine("Shape area = " + s.Area());
Console.WriteLine("Rectangle area = " + r.Area()); // calls Rectangle.Area()
}
}
sealed override
継承階層の特定のレベルでメソッドを固定するには、sealed overrideを使用します。
using System;
public class BaseLogger
{
public virtual string Prefix()
{
return "[LOG]";
}
}
public class ConsoleLogger : BaseLogger
{
public sealed override string Prefix()
{
return "[CONSOLE]";
}
}
// Further derived class cannot override Prefix again:
// public class FancyLogger : ConsoleLogger
// {
// public override string Prefix() { return "[FANCY]"; } // compile error
// }
public class Program
{
public static void Main(string[] args)
{
ConsoleLogger log = new ConsoleLogger();
Console.WriteLine(log.Prefix() + " Ready");
}
}
抽象クラス
abstractクラスは必須のメンバー(abstract)を定義し、共有コードを提供することもできます。
using System;
// Abstract class: cannot be instantiated; must implement abstract members
public abstract class Animal
{
public abstract string Speak(); // no body here
public string Info()
{
return "Animal says: " + Speak(); // shared code uses the abstract member
}
}
public class Dog : Animal
{
public override string Speak()
{
return "Woof";
}
}
public class Program
{
public static void Main(string[] args)
{
// Animal a = new Animal(); // compile error: abstract
Animal d = new Dog();
Console.WriteLine(d.Info()); // calls Dog.Speak()
}
}
virtual と abstract の比較
使い分け:
- virtual:派生型がオーバーライドできる既定の本体を提供します。
- abstract:本体を持たず、派生型が必ず実装します。
- sealed override:動作を確定した後、それ以上のオーバーライドを止めます。
ポリモーフィックな呼び出し
ポリモーフィズムとは、メソッドが基底型を受け取り、派生インスタンス上でオーバーライドされたメンバーを呼び出す仕組みです。
using System;
public class Notifier
{
public virtual string Channel() { return "Base"; }
}
public class EmailNotifier : Notifier
{
public override string Channel() { return "Email"; }
}
public class SmsNotifier : Notifier
{
public override string Channel() { return "SMS"; }
}
public class Program
{
// Works with any Notifier (polymorphism)
static void Send(Notifier n, string msg)
{
Console.WriteLine("[" + n.Channel() + "] " + msg);
}
public static void Main(string[] args)
{
Send(new EmailNotifier(), "Hello");
Send(new SmsNotifier(), "Hi");
}
}
virtual/override/sealed のルール
まとめ
まとめ:基底メソッドにvirtualを付け、派生型でオーバーライドします。動作を固定するにはsealed overrideを使用します。共通コードを共有しながら実装を必須にするにはabstract classを使用します。
よくある質問
「virtual/override/sealedとabstractクラス」レッスンは無料ですか?
はい。「virtual/override/sealedとabstractクラス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「virtual/override/sealedとabstractクラス」で何を学びますか?
virtualメソッド、オーバーライド、オーバーライドのsealed、abstractクラスを学びます。基底クラス型の参照から派生クラスの実装へディスパッチされる仕組みも確認します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「virtual/override/sealedとabstractクラス」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- virtual/override/sealedとabstractクラス
- インターフェース(入門)と複数インターフェースの実装
- ポリモーフィズムと動的ディスパッチ