C# の抽象クラスとメソッド
C# の抽象クラスとメソッド
このチュートリアルでは、例を使用して C# の抽象クラスとメソッドについて学習します。
抽象クラス
C# では、抽象クラスのオブジェクトを作成できません。 abstract
を使用します 抽象クラスを作成するためのキーワード。たとえば、
// create an abstract class
abstract class Language {
// fields and methods
}
...
// try to create an object Language
// throws an error
Language obj = new Language();
抽象クラスは、抽象メソッド (本体のないメソッド) と非抽象メソッド (本体のあるメソッド) の両方を持つことができます。たとえば、
abstract class Language {
// abstract method
public abstract void display1();
// non-abstract method
public void display2() {
Console.WriteLine("Non abstract method");
}
}
先に進む前に、C# の継承について確認してください。
抽象クラスの継承
抽象クラスのオブジェクトを作成できないため、そこから派生クラスを作成する必要があります。派生クラスのオブジェクトを使用して抽象クラスのメンバーにアクセスできるようにします。たとえば、
using System;
namespace AbstractClass {
abstract class Language {
// non-abstract method
public void display() {
Console.WriteLine("Non abstract method");
}
}
// inheriting from abstract class
class Program : Language {
static void Main (string [] args) {
// object of Program class
Program obj = new Program();
// access method of an abstract class
obj.display();
Console.ReadLine();
}
}
}
出力
Non abstract method
上記の例では、Language という名前の抽象クラスを作成しました。 .クラスに非抽象メソッド display() が含まれています .
プログラムを作成しました 抽象クラスを継承するクラス。声明に注目してください、
obj.display();
ここで、obj 派生クラス Program のオブジェクトです .オブジェクト obj を使用して抽象クラスのメソッドを呼び出しています .
注意 :抽象クラスは基本クラスとしてのみ使用できます。これが、抽象クラスをシールできない理由です。詳細については、C# の封印されたクラスとメソッドを参照してください。
C# 抽象メソッド
本体を持たないメソッドは、抽象メソッドとして知られています。 abstract
を使用します 抽象メソッドを作成するためのキーワード。たとえば、
public abstract void display();
ここで、display() 抽象メソッドです。抽象メソッドは、抽象クラス内にのみ存在できます。
非抽象クラスが抽象クラスを継承する場合、抽象メソッドの実装を提供する必要があります。
例:抽象メソッドの実装
using System;
namespace AbstractClass {
abstract class Animal {
// abstract method
public abstract void makeSound();
}
// inheriting from abstract class
class Dog : Animal {
// provide implementation of abstract method
public override void makeSound() {
Console.WriteLine("Bark Bark");
}
}
class Program {
static void Main (string [] args) {
// create an object of Dog class
Dog obj = new Dog();
obj.makeSound();
Console.ReadLine();
}
}
}
出力
Bark Bark
上記の例では、Animal という名前の抽象クラスを作成しました。 .抽象メソッド makeSound() があります クラス内。
犬を飼っています Animal を継承するクラス クラス。 犬 クラスは、抽象メソッド makeSound() の実装を提供します .
// provide implementation of abstract method
public override void makeSound() {
Console.WriteLine("Bark Bark");
}
override
を使用していることに注意してください makeSound() で 方法。これは、メソッドが基本クラスのメソッドをオーバーライドしていることを示しています。
次に、犬のオブジェクトを使用しました makeSound() にアクセスするクラス .
犬なら クラスは、抽象メソッド makeSound() の実装を提供していませんでした 、犬 class も抽象としてマークされているはずです。
注意 :C# の継承とは異なり、virtual
は使用できません 基本クラスの抽象メソッドを使用します。これは、抽象クラスが暗黙的に仮想であるためです。
get および set アクセサーを持つ抽象クラス
get および set アクセサーを抽象としてマークできます。たとえば、
using System;
namespace AbstractClass {
abstract class Animal {
protected string name;
// abstract method
public abstract string Name {
get;
set;
}
}
// inheriting from abstract class
class Dog : Animal {
// provide implementation of abstract method
public override string Name {
get {
return name;
}
set {
name = value;
}
}
}
class Program {
static void Main (string [] args) {
// create an object of Dog class
Dog obj = new Dog();
obj.Name = "Tom";
Console.WriteLine("Name: " + obj.Name);
Console.ReadLine();
}
}
}
出力
Name: Tom
上記の例では、get および set アクセサーを抽象としてマークしました。
obj.Name = "Tom";
Console.WriteLine("Name: " + obj.Name);
name の値を設定および取得しています 抽象クラス Animal のフィールド 派生クラス Dog のオブジェクトを使用 .
抽象クラスのコンストラクタにアクセス
抽象クラスもコンストラクタを持つことができます。たとえば、
using System;
namespace AbstractClass {
abstract class Animal {
public Animal() {
Console.WriteLine("Animal Constructor");
}
}
class Dog : Animal {
public Dog() {
Console.WriteLine("Dog Constructor");
}
}
class Program {
static void Main (string [] args) {
// create an object of Dog class
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
出力
Animal Constructor Dog Constructor
上記の例では、抽象クラス Animal 内にコンストラクターを作成しました。 .
Dog d1 = new Dog();
ここで、派生クラス Dog のオブジェクトを作成すると、 抽象クラス Animal のコンストラクタ も呼び出されます。
注意 :抽象クラス内でデストラクタを使用することもできます。
C# の抽象化
抽象クラスは、C# で抽象化を実現するために使用されます。
抽象化は、オブジェクト指向プログラミングの重要な概念の 1 つです。不必要な詳細を隠して、必要な情報だけを表示することができます。
これにより、よりシンプルで高レベルのアイデアで詳細を隠し、複雑さを管理することができます。
抽象化の実用的な例は、バイクのブレーキです。私たちはブレーキが何をするかを知っています。ブレーキを踏むとバイクが止まります。ただし、ブレーキの働きは私たちには隠されています。
ブレーキの動作を隠すことの主な利点は、メーカーがバイクごとに異なるブレーキを実装できるようになったことです。ただし、ブレーキの機能は同じです。
例:C# の抽象化
using System;
namespace AbstractClass {
abstract class MotorBike {
public abstract void brake();
}
class SportsBike : MotorBike {
// provide implementation of abstract method
public override void brake() {
Console.WriteLine("Sports Bike Brake");
}
}
class MountainBike : MotorBike {
// provide implementation of abstract method
public override void brake() {
Console.WriteLine("Mountain Bike Brake");
}
}
class Program {
static void Main (string [] args) {
// create an object of SportsBike class
SportsBike s1 = new SportsBike();
s1.brake();
// create an object of MountainBike class
MountainBike m1 = new MountainBike();
m1.brake();
Console.ReadLine();
}
}
}
出力
Sports Bike Brake Mountain Bike Brake
上記の例では、抽象クラス MotorBike を作成しました。 .抽象メソッド brake() があります .
brake() として brake() の実装である抽象メソッドです。 バイクで は隠されています。
バイクごとにブレーキの実装が異なります。これがSportsBikeの理由です brake() の独自の実装を作成します そしてマウンテンバイク brake() の独自の実装を作成します .
注意 :インターフェイスを使用して、C# で完全な抽象化を実現します。詳細については、C# インターフェイスをご覧ください。
C言語