ホームページ  >  記事  >  バックエンド開発  >  C# での抽象化

C# での抽象化

WBOY
WBOYオリジナル
2024-09-03 15:19:45275ブラウズ

抽象化はオブジェクト指向プログラミングの重要な部分です。 C# は、実装の詳細を隠し、重要な情報のみをユーザーに提供するプロセスである抽象化をサポートしています。 C# では、抽象クラスとメソッドを使用して抽象化を実現できます。

次に、抽象クラスに関する重要な点をいくつか示します。

  • クラス名とメソッド名の先頭にキーワード abstract を付けることで、抽象クラスとメソッドを定義できます。
  • 抽象クラスのオブジェクトを作成することはできません。
  • 抽象クラスには、抽象メソッドと非抽象メソッドを含めることができます。
  • 抽象クラスはシールされたクラスとして宣言できません。

説明付きの構文:

以下の構文に示すように、キーワード 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
}
}

C# での抽象化の例

ユーザーは、サブクラス全体で共有できる一般化された形式のメソッドとプロパティをスーパークラスに作成する必要がある場合があります。サブクラスは、メソッドの実装を適切に提供することで、要件に応じてこれらのメソッドとプロパティを使用できます。

例 #1

コード:

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);
}
}
}

出力:

C# での抽象化

上記の例では、抽象クラス「Shape」で定義されているメソッドは両方とも抽象メソッドです。したがって、Shape は純粋な抽象基本クラスであり、派生クラスは Shape クラスの両方のメソッドの実装を提供する必要があります。

例 #2

コード:

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();
}
}

出力:

C# での抽象化

例 #3

以下の例に示すように、抽象クラスには非抽象メソッドを含めることもできます。

コード:

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# での抽象化

例 #4

以下の例に示すように、抽象クラスとメソッドとは別に、プライベート アクセス修飾子を使用して 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# での抽象化

上記の例は、パブリック メソッドには他のクラスからアクセスできるが、他のクラスからプライベート メソッドを呼び出すことはできないことを示しています。したがって、必要な情報のみを提供し、他の詳細を非表示にすることで、抽象化を実現できます。

結論 – C# の抽象化

オブジェクト指向プログラミングの抽象化は、実装の詳細を隠し、必要な情報のみをユーザーに提供することでセキュリティを提供します。抽象メソッドを利用して実装の詳細を隠すことができる抽象クラスを使用します。抽象化はインターフェイスを使用して実現することもできます。

以上がC# での抽象化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
前の記事:MVVM C#次の記事:MVVM C#