抽象化はオブジェクト指向プログラミングの重要な部分です。 C# は、実装の詳細を隠し、重要な情報のみをユーザーに提供するプロセスである抽象化をサポートしています。 C# では、抽象クラスとメソッドを使用して抽象化を実現できます。
次に、抽象クラスに関する重要な点をいくつか示します。
説明付きの構文:
以下の構文に示すように、キーワード abstract を使用して抽象クラスとメソッドを宣言できます。
//abstract class abstract class class_name { //abstract method public abstract <return_type> method_name(); }
上記の構文では、抽象メソッドには誰も持たないことがわかります。派生クラスは、抽象クラスの抽象メソッドの実装を提供します。抽象クラスには、それを継承したクラスによってアクセスできます。
抽象クラスの外で抽象メソッドを宣言することはできませんが、以下の構文に示すように、抽象クラスには非抽象メソッドを含めることができます。
abstract class class_name { //abstract method public abstract <return_type> method_name(); //non-abstract method public <return_type> method_name() { //user code } }
ユーザーは、サブクラス全体で共有できる一般化された形式のメソッドとプロパティをスーパークラスに作成する必要がある場合があります。サブクラスは、メソッドの実装を適切に提供することで、要件に応じてこれらのメソッドとプロパティを使用できます。
コード:
using System; namespace abstraction { //abstract class abstract class Shape { //abstract methods public abstract double calculateArea(); public abstract void displayDetails(double area); } //Rectangle class inheriting Shape class class Rectangle : Shape { //private data members private double length; private double breadth; public Rectangle(double length, double breadth) { this.length = length; this.breadth = breadth; } //overriding abstract methods of Shape class using 'override' keyword public override double calculateArea() { return (length * breadth); } public override void displayDetails(double area) { Console.Write("Length of rectangle: "+length); Console.Write("\nBreadth of rectangle: "+breadth); Console.Write("\nArea of rectangle: "+area); } } //Square class inheriting Shape class class Square : Shape{ //private data members private double side; public Square(double side) { this.side = side; } //overriding abstract methods of Shape class using 'override' keyword public override double calculateArea() { return (side * side); } public override void displayDetails(double area) { Console.Write("Length of a side of square: "+side); Console.Write("\nArea of square: "+area); } } public class AbstractionDemo { public static void Main(string[] args) { double area; //creating reference of Shape class using Rectangle class Shape shapeRec = new Rectangle(5,6); area = shapeRec.calculateArea(); shapeRec.displayDetails(area); Console.WriteLine("\n"); //creating reference of Shape class using Square class Shape shapeSquare = new Square(4); area = shapeSquare.calculateArea(); shapeSquare.displayDetails(area); } } }
出力:
上記の例では、抽象クラス「Shape」で定義されているメソッドは両方とも抽象メソッドです。したがって、Shape は純粋な抽象基本クラスであり、派生クラスは Shape クラスの両方のメソッドの実装を提供する必要があります。
コード:
using System; abstract class Mobile { public abstract void mobileDetails(); } class Apple : Mobile { public override void mobileDetails() { Console.WriteLine("Model: IphoneX"); Console.WriteLine("Screen size: 5.8 inch"); Console.WriteLine("Processor: A11 Bionic Processor"); } } class Motorola : Mobile { public override void mobileDetails() { Console.WriteLine("Model: G5 plus"); Console.WriteLine("Screen size: 5.2 inch"); Console.WriteLine("Processor: octa-core Snapdragon"); } } public class AbstractionDemo { public static void Main(string[] args) { Mobile mobileApple = new Apple(); mobileApple.mobileDetails(); Console.WriteLine(""); Mobile mobileMoto = new Motorola(); mobileMoto.mobileDetails(); } }
出力:
以下の例に示すように、抽象クラスには非抽象メソッドを含めることもできます。
コード:
using System; namespace abstraction { abstract class Birds { //abstract method public abstract void birdDetails(); //non-abstract method public void canFly(bool canFly, string name) { if(canFly) Console.WriteLine(name+" can fly"); else Console.WriteLine(name+" cannot fly"); } } class Parrot : Birds { public override void birdDetails() { Console.WriteLine("Parrots have different colours and size"); } } class Ostrich : Birds { public override void birdDetails() { Console.WriteLine("Ostrich is the largest living bird"); } } public class AbstractionDemo { public static void Main(string[] args) { Birds birdParrot = new Parrot(); birdParrot.birdDetails(); birdParrot.canFly(true, "Parrot"); Console.WriteLine(""); Birds birdOstrich = new Ostrich(); birdOstrich.birdDetails(); birdOstrich.canFly(false, "Ostrich"); } } }
出力:
以下の例に示すように、抽象クラスとメソッドとは別に、プライベート アクセス修飾子を使用して C# で抽象化を実現できます。
コード:
using System; namespace abstraction { public class Bank { private string name; private string branch; private string ifscCode; public string Name { get { return name; } set { name = value; } } public string Branch { get { return branch; } set { branch = value; } } public string IfscCode { get { return ifscCode; } set { ifscCode = value; } } public void bankDetails() { Console.WriteLine("Bank name: " + Name); Console.WriteLine("Branch name: " + Branch); Console.WriteLine("IFSC code: " + IfscCode); } public void bankAddress() { Console.WriteLine("Address: Andheri, Mumbai"); } private void numberOfAccounts() { Console.WriteLine("Account Information"); } private void numberOfLockers() { Console.WriteLine("Locker Information"); } } public class AbstractionDemo { public static void Main(string[] args) { Bank bank = new Bank(); bank.Name = "ABC"; bank.Branch = "XYZ"; bank.IfscCode = "ABC123"; bank.bankDetails(); bank.bankAddress(); //Error -'Bank.numberOfAccounts()' is inaccessible due to its protection level //bank.numberOfAccounts(); //Error - 'Bank.numberOfLockers()' is inaccessible due to its protection level //bank.numberOfLockers(); } } }
出力:
上記の例は、パブリック メソッドには他のクラスからアクセスできるが、他のクラスからプライベート メソッドを呼び出すことはできないことを示しています。したがって、必要な情報のみを提供し、他の詳細を非表示にすることで、抽象化を実現できます。
オブジェクト指向プログラミングの抽象化は、実装の詳細を隠し、必要な情報のみをユーザーに提供することでセキュリティを提供します。抽象メソッドを利用して実装の詳細を隠すことができる抽象クラスを使用します。抽象化はインターフェイスを使用して実現することもできます。
以上がC# での抽象化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。