このセクションでは、オブジェクト指向プログラミングとは何かについて説明します。オブジェクト指向について話す前に、私たちが言及しなければならないのは、プロセス指向プログラミングです。C言語はプロセス指向言語です。2つの違いは何ですか?シナリオを想像することができます-キッチンでの調理:
プロセス指向の形式で説明すると、最初のステップ:材料の準備、2番目のステップ:火の開始、3番目のステップ:かき混ぜる、4番目のステップ:サーブ;プロセス指向は関数を作成することであり、各関数は操作の一部を実行します。最後に、この一連の機能によれば、目的は全体的な要件を実装することです。
オブジェクト指向の場合、同じ方法で調理について説明しました。最初のステップ:シェフ、ストーブ、ウェイターが必要です。2番目のステップ:シェフが材料を準備します。3番目のステップ:ストーブが燃えています。4番目のステップ:シェフかき混ぜて揚げる、5番目のステップ:ウェイターが料理を出します。オブジェクト指向のプログラミングメソッドは、元の独立した関数をそれらが属するオブジェクトで編成し、それらをメソッドにカプセル化します(オブジェクト指向の「関数」には、メソッドと呼ばれる新しいメソッドがあります)。実際にはコードの量は増えますが、各オブジェクトの責任が明確であるため、この種のプログラミングの考え方は合理的で現実的で理解しやすく、後のメンテナンスがより便利になります。
以下のコードレベルで、オブジェクト指向とプロセス指向の違いを示します。
手続き化:
#include "stdio.h"
void Prepare(){
printf("准备食材。\n");
}
void Fire(){
printf("起火\n");
}
void Cooking(){
printf("炒菜,\n");
printf("炒完了\n");
}
void Serve(){
printf("请享用。");
}
main(){
Prepare();
Fire();
Cooking();
Serve();
}
客観化:
//创建三个对象
//厨师
class Cook
{
//准备食材的方法
public void Prepare()
{
Console.WriteLine("厨师准备食材。");
}
//做饭的方法
public void Cooking()
{
Console.WriteLine("厨师正在做饭...");
Console.WriteLine("厨师做好了。");
}
}
//灶台工具类
static class CookingBench
{
//静态工具方法:起火
public static void Fire()
{
Console.WriteLine("灶台生火。");
}
}
//服务员
class Waiter
{
//上菜方法
public void Serve()
{
Console.WriteLine("请享用。");
}
}
mainメソッドで呼び出されます:
Cook cook=new Cook();
Waiter waiter=new Waiter();
cook.Prepare();
CookingBench.Fire();
cook.Cooking();
waiter.Serve();
オブジェクト指向には、カプセル化、継承、および多態性という3つの特性があります。以下でそれについて詳しく話しましょう:
パッケージ:
誰もが独自の秘密を持っています。オブジェクト指向のコードでも同じことが言えます。オブジェクトの中には、外の世界で見ることができるオブジェクトと、外の世界で見ることができないオブジェクトがあります。一部のメンバーを非表示にするというこのアイデアはカプセル化です。カプセル化を実現するには、まずカプセル化を行う必要があります。パブリック、プライベート、プロテクト、内部の4つのアクセス修飾子について学習します
アクセス修飾子は、クラス、プロパティ、およびメソッドを変更できます。修飾子を使用して、さまざまなアクセスレベルでクラスまたはプロパティとメソッドを変更します。アクセス修飾子は、次のように宣言するときに最初に記述する必要があります。
public class publicClass{}//声明一个类
private bool isPublic;//声明一个属性
public:public、このアクセスレベルは最低です。
private:private、名前が示すように、このアクセスレベルは最高であり、宣言の範囲内でのみアクセスできます。
保護:保護されており、継承チェーンでのみアクセスできます。率直に言って、継承されたクラスのみがこのクラスの保護されたメンバーにアクセスできます。
内部:内部、同じアセンブリ内でのみアクセス可能。同じ名前名でアクセスできると狭義に理解できます。
コンビネーションパンチもあります。同じアセンブリを満たすために内部を保護しますが、アクセスするための関係を継承する必要もあります。
これらのキーワードを通じて、カプセル化を実現できます。開発時には、作成するクラスやプロパティ、メソッドなどに割り当てるアクセス許可の種類を指定するだけで済みます。
継承:
継承の概念も理解しやすいです。実際の生活のように、子供は親のプロパティを継承し、次に親のものが子供になります。C#では、クラス間の継承は「:」によって実現されます。の。
public class Father{}
public class Chlid:Father{}//Child类继承了Father
C#は単一の継承言語であることに注意してください。つまり、クラスは1つの親クラスしか継承できません。
サブクラスは、親クラスの非プライベートプロパティまたはメソッドを継承できます。プライベートプロパティまたはメソッドにアクセスできる場合、protectキーワードはありません。継承により、サブクラスで共有される反復コードを親クラスに抽出できるため、すべてのサブクラスでこれらのメンバーを宣言する必要がなくなり、多くのコードが削減されます。C#の継承構造では、オブジェクトクラスはすべてのクラスの親クラスであり、デフォルトではすべてのクラスがオブジェクトを継承します。オブジェクトクラスは、一般的に使用されるtostring()メソッドなど、クラスの最も基本的なメンバーのいくつかを提供します。
オブジェクト指向には、オープンクローズ原則と呼ばれる原則があります。この原則は、変更に対してクローズであり、拡張に対してオープンであると規定しています。つまり、クラスを作成して一定期間使用した後、プロジェクトのアップグレードなどの理由でこのクラスを変更する必要があります。 (新しいものを追加)現時点では、開閉の原則により、直接変更することはできません。代わりに、別のクラスを作成して継承し、サブクラスに新しいビジネスロジックを追加する必要があります。これも継承の目的です。
継承には、メソッドオーバーライドと呼ばれる別の概念があります。つまり、サブクラス内のメソッドは、継承された親クラスのメソッドと同じ名前であるため、サブクラスメソッドは親クラスメソッドを上書きします。このプロセスは書き換えです。この概念は、クラスとメソッドを具体的に紹介するセクションで詳細に拡張されます。
多形性:
多形性は継承に依存し、継承のみが多形性を達成できます。同じタイプで、形が異なりますが、多形性です。たとえば、犬にはさまざまな形があります。ハスキー、牧歌的な犬、コーギなどです。コードの表現は、親クラスがサブクラスを受け取って値を割り当てることができるということです。上記の例をもう一度見てください。次のコードは多形性の例です。
Father f=new Chlid();
多態性の基礎は、リヒターの変換原理です。子クラスは親クラスを継承します。次に、子クラスは親クラスのすべての明示的な機能を継承し、親クラスは実行できるため、親クラスに最初に適用されたシーンを子クラスに適用する必要があります。はい、サブクラスもそれを行うことができます。この原則は、この理論の存在を定義することです。サブクラスは、親クラスを直接置き換えて、すべての親クラスをサブクラスに変換できます。プログラムの動作に違いはありません。
多態性は、オブジェクト指向プログラミングの非常に重要な基礎でもあります。私たちは通常、プログラミングで可能な限りインターフェースを使用し、抽象化を指向し、結合を減らします。多形性のため、インターフェースまたはいくつかの抽象データ構造を介してインスタンス操作を実装できます。 。
最後に、例を使用して多形性を示します(クラスとメソッドに関連するいくつかの知識については、クラスとメソッドの次のセクションで詳しく説明します)。
public class Dog
{
public string name { get; set; }
public Dog(string name)
{
this.name = name;
}
public void introduce()
{
Console.WriteLine("这是一只:" + name);
}
}
public class Husky : Dog
{
//调用父类的构造方法,为name赋值
public Husky():base("Husky"){}
}
public class Koji : Dog
{
public Koji() : base("Koji"){}
}
class DogStore
{
public Dog dog { get; set; }
public DogStore(Dog dog)
{
this.dog = dog;
}
public void wantBuy()
{
Console.WriteLine("Do u want this "+dog.name+"?");
}
}
上記のコードには共通のDogクラスがあり、Corgiが継承した2つのHuskyクラスがそれぞれあります。属性Dogを必要とするペットドッグショップもあります。
mainメソッドのコードを見てみましょう。
DogStore dogStore=new DogStore(new Husky());
dogStore.wantBuy();
dogStore=new DogStore(new Koji());
dogStore.wantBuy();
親クラスを介してより具体的なサブクラスを受け取ります。これは多態性の非常に優れた実施形態であり、非常にエレガントで効率的なプログラミング方法でもあります。
個人の公開アカウント、共有するのが大好き、知識は貴重です。