C#オブジェクト向け(マルチステート)


クラスの継承では、c#はベースクラスと派生クラスで同名のメソッドを宣言することを許可し、同名のメソッドは異なるコード、すなわちベースクラスと派生クラスの同じ機能に異なる事項メソッドがあり、同じ問題を解決するために多くの方法を提供することができる.
多態性は多重形式を意味する.オブジェクト向けプログラミングパターンでは、マルチステート性は「1つのインタフェース、複数の機能」として表現されることが多い.
多態性は静的または動的であってもよい.静的多態性では,関数の応答はコンパイル時に発生する.動的多様性では,関数の応答は実行時に発生する.
せいてきたじょうたいせい
コンパイル時、関数とオブジェクトの接続メカニズムは初期バインドと呼ばれ、静的バインドとも呼ばれます.C#は静的多態性を実現するための2つの技術を提供する.それぞれ:
関数リロード演算子リロードダイナミックマルチステート
C#では、キーワードabstractを使用して抽象クラスを作成し、インタフェースの一部のクラスの実装を提供できます.派生クラスが抽象クラスから継承されると、実装は完了します.抽象クラスには抽象メソッドが含まれ、抽象メソッドは派生クラスによって実現されます.派生クラスには、よりプロフェッショナルな機能があります.
抽象クラスに関するいくつかのルールに注意してください.
抽象クラスのインスタンスを作成することはできません.
抽象クラスの外部で抽象メソッドを宣言することはできません.
クラス定義の前にキーワードsealedを配置することで、クラスをシールクラスとして宣言できます.クラスがsealedと宣言された場合、クラスは継承されません.抽象クラスはsealedとして宣言できません.
マルチステートの出現はコード多重性、拡張性を向上させ、後期メンテナンスをより便利にします.
マルチステートの弊害:前期定義のコンテンツは後期サブクラスの特有のコンテンツを使用できない(呼び出す)
マルチステートを使用する前提:
1.一つのものに別の形を持たせるには、必ず継承関係(実現)がある
2.上書きしてください.親タイプを操作します.
マルチステートのメンバー
:
Fu f=new Zi();
f.show;
変数:
親シェイプは子オブジェクトを指し、親の変数を呼び出します.
コンパイル時:参照変数のタイプに呼び出されたメンバー変数があるかどうか、ある場合はコンパイルによって、ない場合はエラーを報告します.
実行時:参照変数のタイプに呼び出しメンバー変数があるかどうか、ない場合はクラスの変数を実行します.
簡単に言えば、コンパイルも実行も等号の左側を見ます.
方法:
コンパイル時:参照変数タイプに呼び出しメンバー変数があるかどうか、ある場合はコンパイルに合格し、ない場合はエラーを報告する
実行時:参照オブジェクトに呼び出された関数があるかどうか、ある場合は呼び出され、ある場合は呼び出されます(親)
簡単に言えば、コンパイルは左を見て、実行は右を見ます.
C#では、複数の方法で多態性を実現できます.
A.ダミーメソッド:親メソッドをダミーメソッドとしてマークします(キーワードvirtualを使用します).このメソッドは子クラスで書き換えることができます(キーワードoverrideを使用します)
B.抽象クラスと抽象メソッド:親を使用してオブジェクトを作成する必要がない場合、彼の存在は子クラスに継承されるだけです.親は抽象(キーワードabstract)クラス、親メソッドは抽象メソッドと書くことができ、子クラスのメソッドはキーワードoverrideで書き換えることができます.
C.インタフェース実装:
ベースクラスインスタンス化オブジェクトを使用するかどうかに応じて,虚法を用いてマルチステートを実装するか抽象書き込み抽象法を用いてマルチステートを実装するかを選択した.
抽象クラス:
ベースクラスを使用してインスタンス化するオブジェクトは必要ありません
(抽象を利用して実現し,クラス抽象化,メソッド抽象化,メソッド中にメソッド体{}が存在しない)
ダミーメソッド:
ベースクラスインスタンス化が必要なオブジェクト
namespace   
{

    //     
    abstract class Vertebrata
    {
        //      :  
        public abstract void DrawSelf();

    }

    class Zhu : Vertebrata
    {
        public override void DrawSelf()
        {
            Console.WriteLine(@"
╭︿︿︿╮
{/ o  o /}  
 ( (oo) )  
  ︶︶︶");
        }
    }

    class QingWa : Vertebrata
    {
        public override void DrawSelf()
        {
            Console.WriteLine(@"
  @..@
 (\--/)
(.>__<. class="" program="" static="" void="" main="" args="" vertebrata="" animals="new" new="" zhu="" qingwa="" foreach="" someone="" in="" someone.drawself=""/>

is演算子
is演算子は、通常、オブジェクトが何らかのタイプであるかどうかを判断するために使用されます.
//  Human   Vertebrata
Human jean=new Human();
Vertebrata someone=jean;
if(someone is Human){
  Console.WriteLine("someone is Human");
}
if(someone is Vertebrata){
  Console.WriteLine("someone is Vertebrata");
}

アップシフト
低階層タイプから高階層タイプに変換され、アップタイプ変換と呼ばれます.アップタイプ変換は自動的に行われます.例えばintタイプ変数をlongタイプ変数に、longタイプをdouble型変数に、変換は自動的に行われます.
派生クラスからベースクラスに変換するのもアップコンバートですが、ベースクラスの参照子はパーティー生クラスオブジェクト特有の関数を参照できません.
//    Vertebrata  work  , Human     work  
   Human jean =new Human();
   Vertebrata someone =jean;
   //        .
   someone.Work();

ダウンシフト
ベースクラスから派生クラスへの変換プロセスをダウン変換と呼ぶ、このプロセスでは強制変換が必要であり、キーワードasも用いることができる.
Human jean=new Human();
Vertebrata someone=jean;

if(someone is Human){
  Human people =(Human)someone; //    
  people.Work();
}

注意:
*ベースクラスから派生クラスへの変換時のみ、強制的にダウンコンバートできます.そうしないと、プログラムは例外を放出するので、変換する前にis演算子を使用してチェックします.
Human jean=new Human();
Vertebrata someone=jean;
Human people =someone as Human; //as    
  if(people!=null){
    people.Work();
  }

よくあるエラー:プログラム.Compile with/main to specify the type that contains the entrypoint.
プロジェクトには複数のエントリポイントの定義があります.コンパイル/主にタイプを指定します.このタイプには、エントリポイントが含まれます.