抽象学習のC#の基本
1.定義
抽象クラスは、問題領域の分析と設計から導き出された抽象的な概念を特徴づけるためによく使用されます。これは、見た目は異なりますが本質的に同じである一連の具体的な概念を抽象化したものです。
2.機能
-
インスタンス化できません。主に継承に使用されます
-
2種類の抽象メンバー、つまり抽象属性と抽象メソッドを含めることができ、他の非抽象メンバーを含めることができます
-
抽象クラスを継承する場合は、抽象クラスの抽象プロパティとメソッドを実装する必要があります
-
Sealedはクラスを継承できないことを意味し、Staticは抽象クラスを変更できないため、Sealedキーワードを使用して抽象クラスを変更することはできません。
つまり、抽象クラスは継承に使用され、継承後のサブクラスは、抽象クラスの意志を実現するために、抽象クラスの意志に従う必要があります。つまり、抽象クラスのすべての抽象メソッドと抽象プロパティを継承します。
簡単なアプリケーション例:
(1)抽象クラスFruitを定義します。抽象クラスには、パブリック属性vendor、抽象属性Price、および抽象メソッドGrowAreaがあります。コードは次のとおりです。
namespace AbstractClassLearn
{
public abstract class Fruit
{
public string vendor { get; set; }
public abstract float Price { get; }
public abstract void GrowArea();
}
}
(2)抽象クラスを継承するAppleクラスを定義します。コードは次のとおりです。
namespace AbstractClassLearn
{
public class Apple : Fruit
{
public override float Price
{
get
{
if (vendor == "红富士")
{
return 1000;
}
else return 0;
}
}
public override void GrowArea()
{
Console.WriteLine("水果品种:" + vendor + " " + "当前价格是:" + Price);
}
}
}
(3)抽象クラスを継承するOrangeクラスを定義します。コードは次のとおりです。
namespace AbstractClassLearn
{
public class Orange : Fruit
{
public override float Price
{
get
{
if (vendor == "橘子") return 200;
else return 0;
}
}
public override void GrowArea()
{
Console.WriteLine("水果品种:" + vendor + " " + "当前价格是:" + Price);
}
}
}
(4)メイン関数に入力します。
namespace AbstractClassLearn
{
class Program
{
static void Main(string[] args)
{
Fruit f = new Apple();
f.vendor = "苹果";
f.GrowArea();
f = new Orange();
f.vendor = "橘子";
f.GrowArea();
Console.ReadKey();
}
}
}
結果を次の図に示します。
3.どのような状況で抽象クラスを使用する必要がありますか
例:「犬」、「猫」、「馬」などのオブジェクト(クラス)を作成する必要があります。これらには、口、尻尾、体重、色、サイズなどの一般的なプロパティがいくつかありますが、これらは相互に排他的です。属性(口のサイズ、尻尾の長さなど)には違いがあります。この場合、各属性を1つずつ定義すると面倒になります。抽象クラスを使用する場合、実装プロセスは非常に便利です。
抽象クラスのより良い側面、つまり「類似性と異なるイメージ」もあります。これは次のように説明されます。犬、猫、馬など、異なる実装形式で本質的に同じ継承メソッドは異なる呼吸メソッドまたはさまざまな実行速度フォーム。抽象クラスで抽象メソッドを定義し、抽象クラスから継承させ、抽象メソッドで独自のフォームを実装します。抽象化の意味は、共通のものを抽出してカプセル化することですが、それらを実装するのではなく、継承することにあります。
4.まとめ
-
抽象クラスの抽象属性と抽象メソッドは、public修飾子を使用してpublicである必要があります
-
サブクラスは、抽象クラス内のすべての抽象属性と抽象メソッドをオーバーライドする必要があります。抽象クラス内のすべての抽象プロパティとメソッドをオーバーライドする必要がない場合、サブクラスは抽象クラスである必要があります。
-
抽象クラスは、非抽象属性と非抽象メソッドを持つことも、プライベートまたはパブリックにすることもできますが、プライベートの場合、サブクラスにアクセスできず、意味がないため、通常はパブリックとして記述されます。
-
抽象メソッドまたは抽象プロパティを持つクラスは抽象クラスである必要があり、抽象クラスのプロパティまたはメソッドは必ずしもすべて抽象である必要はありません
-
抽象メソッドは関数本体を持つことはできず、定義することしかできず、特定の実装を含めることもできません。抽象クラスをインスタンス化することはできませんが、継承することしかできません。