C#プログラミングの詳細(b)に深くオブジェクト指向

オブジェクト指向の理解深めます

  //**封装**:数据安全;内部修改保持稳定;提供重用性;分工合作,职责分明;
  //方便构建大型复杂的系统
  //**继承**:去掉重复代码;可以实现多态
 //侵入性很强的类关系 
 //**多态**:相同的变量 相同的操作,但是不同的实现
 //方法的重载  接口&实现  抽象类&实现  继承

仮想抽象メソッドの選択方法&

仮想メソッドは:
1は、この方法は、この方法は、所定の論理再サブクラスにオーバーライドすることができ、すなわち、親クラスとの多型の方法は、一般的な方法で、仮想メソッドをオーバーライドすることができ表します。
図2に示すように、仮想メソッドを直接使用し、定期的な方法であることができます。
図3は、書き換えなければならない。サブクラスがベースに使用することができる。メソッド呼び出しの、書き換えるサブクラスにおいてオーバーライドの使用の有無にかかわらず。
virtualキーワードが、明らかに、この方法を書き換えることができマーク、そして実際に、それは一般的なアプローチであるが、違いはありません
それぞれの
このメソッドはオーバーライドすることはできませんマークされ密封されたキーワード
抽象メソッド:
1、抽象メソッドは実装セクションを提供していません。
2、抽象メソッドは抽象クラスで宣言することができます。
3、抽象メソッドは、力をオーバーライド、または派生クラスをインスタンス化することができない方法で派生クラスです。

1、
IExtendはiPhoneを延長=新新(); //新しい新IExtend();
extend.Video(); //実行時ポリモーフィズムの
BasePhone電話=新しい新しいiPhone();
extend.Video(); //エラー:理由がコンパイルされています検査は、実際には、ランニングは問題ありませんが、コンパイラは識別することによって残すことができ
、2
)なぜ直接iphone iが(新しい携帯電話を=?
パラメータがBaseiphoneであれば後期簡単なiphoneのメソッドを呼び出すと、メンテナンスを変更するには、バックHuawei社を呼び出すように変更なし変更する必要がある、または新しいメソッド華為作成する必要はありません
抽象顔:これだけ、内側のみ抽象的なものとし
、パーソナライズされた操作がある場合あなたはそれパーソナライズ使用してジェネリック医薬品の動作を追加する必要がある場合に何の意味が、存在しないため、その後、抽象ない
3を、
インターフェースや抽象クラスを選択する方法
のインターフェイスを:唯一のクラスは何ができるか(より柔軟でより多くの制約が行うことができます達成することができます)
抽象クラス:一般的な実装は、単一の継承が(何をすべきか、どのようなこのクラスがクラスである)で行うことができる
ゲート:内のインターフェイス上の材料1匹の猫ドア3 ----- 3、例えば
ドア(2)クローズ抽象的に配置された(2)アラーム(3)----

インターフェースは、よりシンプルかつ柔軟であるため、いくつかの一般的な必要性を継承していない限り、//、より多くのインターフェイスを使用
IBaseService-BaseService-UserServiceのを

通常の方法を使用する場合、静的メソッドを使用するときに
拡張を決定する方法がない場合を除き、一般に共通とすることができる、
しかし、この方法は、静的なツールであることができます

深め委託

:クライアントクラスには、いくつかのメソッドを建てSystem.MulticastDelegateから継承という点である
パブリックデリゲート無効NoReturnNoPara(TのT) ; // 1、 声明:
NoReturnNoPara新しい新しいNoReturnNoPara方法=(this.DoNothing); //デリゲートのインスタンス2の
または方法(); //デリゲートの呼び出し(デリゲートたinvoke関数に渡された実行のインスタンスメソッドである)method.Invoke()
理由を呼び出すだけが、デリゲートの内側に、この方法ではありませんか?
ポインタとして共通ロジックに渡された論理実現、デリゲート関数を解析するために
コードの重複の低減、デカップリングDELEGATE
:使用実施例
1、及びデータベース操作に接続するようなコードが繰り返される
パブリックT ExcuteSql(文字列のSQL、のFunc <のIDbCommand T> FUNC)
{
(コネチカットSqlConnectionのSqlConnectionの新しい新=( ""))を用いて、
{
conn.Open();
//は、拡張されたトランザクションとすることができる
のIDbCommand conn.CreateCommand CMD =();
cmd.CommandText = SQL;
cmd.CommandType CommandTypeを= .text;
戻りFUNC(CMD);
}
}
多くの場合、再利用されるtrycatch 2、
///
///一般的な例外処理
///
任意の論理に///対応する
パブリック静的ボイドSafeInvoke(アクションACT)
{
試み
{
act.Invoke();
}
キャッチ(例外EX )//例外処理の種類によって区別
{
Console.WriteLineを(ex.Message);
}
}

マルチスレッドの非同期:校長に基づいて
WithReturnNoPara方法、=新しい新WithReturnNoPara(this.GetSomething);
int型= iResult Method.invoke();
iResult =法、();
varは結果をmethod.BeginInvoke =(NULL、NULL); //非同期呼び出し
方法。 EndInvokeを(結果)。

委任マルチキャスト
チェーン法形成する
例を用いて順次、それを必要とするメソッドまたはクラスを行う方法を、同じクラスのものであってもよいが、マルチキャストデリゲートにこの時点でこのメソッドまたはクラスのメソッドで実行されるわけではないかもしれ
2信頼の特別な種類が
16個のパラメータは、一般的な代表団値アクション0ダオを返さない
のFunc 0ダオ16バンド引数ジェネリックデリゲートの戻り値
存在意義:パラメータリスト戻り値の型のような信頼のルックスの多くをされている同じですが、普遍的ではありません
//例えば、ThreadStartデリゲートの廃棄物である、同じフレームコンポーネント定義の異なる種類に就役
ので、統一するために、我々はすべての標準アクションのFunc使用//
イベントを
イベントの性質は、マルチキャストデリゲートで、イベントキーワードでデリゲート例は、イベントは、変数は、外部コール/直接代入されている制限することができます
。//代表者とイベントとその接続?
//デリゲートは、学生として、タイプです
//イベントデリゲート型のインスタンスであるのがよりエキサイティングな記述
例の使用:Observerパターン

///イベントは:あなたが指定する第三者に出変数アクション/振る舞いパッケージの束を置くことができる
。この実装は、イベントの発行元を示すようにしてくださいます(、加入者は、登録された別のイベントアクションを書き込みます)
///所定の時間番組として、我々は二つの部分にプログラムを置くことができる
///部分が固定されており、直接死への書き込み、何の固定場所はありません、外部の自由を拡張するイベントオープンインタフェース、を経ますアクション
///
///フレーム:固定/共通部分に、可変拡張ポイントの一部を残して、カスタムのサポート

タイトル:データベースへのアクセスを複数繰り返されるA方式は、デカップリング委任したい、重複したコードを削除

最初は、重複コード方式のために作られた一体化することができる
プライベートT ExcuteSql(SQL文字列のFunc <SqlCommandオブジェクト、T> FUNC)
{
使用(コネチカットSqlConnectionのSqlConnectionの新しい新=(StaticConstant.SqlServerConnString))
{
使用(SqlCommandオブジェクトSqlCommandオブジェクト新しい新しいコマンド=(SQL、コネティカット))
{
conn.Open();
のSqlTransaction conn.BeginTransactionのSqlTransaction =();
試み
{
command.Transaction =のSqlTransaction;
//command.Parameters.AddRange(parameters);
T = TResult func.Invoke(コマンド);
SqlTransaction.Commit ();
戻りTResult;
// int型iResult command.ExecuteNonQuery =();
// IF(iResult == 0)
//スロー新しい新しい例外( "更新データがありません");

                }
                catch (Exception ex)
                {
                    sqlTransaction.Rollback();
                    throw;
                }
            }
        }
    }

对于查询
パブリックTの検索(INT番号)T:BaseModel
{
タイプtype = typeof演算(T)。
//ストリングcolumnString = string.Join( " " type.GetProperties()を選択した(p => $"[{p.GetColumnName()}]")。)。
//文字列のSQL = $「SELECT {columnString} FROM [{type.Name}]ここで、ID = {ID}」。
文字列のSQL = $ "{TSqlHelper.FindSql} {ID};";

此处的sql语句也为了避免重复进行了封装
static TSqlHelper()
        {
            Type type = typeof(T);
            string columnString = string.Join(",", type.GetProperties().Select(p => $"[{p.GetColumnName()}]"));
            FindSql = $"SELECT {columnString} FROM [{type.Name}] WHERE Id=";
            FindAllSql = $"SELECT {columnString} FROM [{type.Name}];";
        }
        T t = null;// (T)Activator.CreateInstance(type);
        Func<SqlCommand, T> func = new Func<SqlCommand, T>(command =>
        {
            SqlDataReader reader = command.ExecuteReader();
            List<T> list = this.ReaderToList<T>(reader);
            T tResult = list.FirstOrDefault();
            return tResult;
        });
        t = this.ExcuteSql<T>(sql, func);
        }
源程序逻辑对比
     //using (SqlConnection conn = new SqlConnection(StaticConstant.SqlServerConnString))
    //{
    //    SqlCommand command = new SqlCommand(sql, conn);
    //    conn.Open();
    //    SqlDataReader reader = command.ExecuteReader();
    //    List<T> list = this.ReaderToList<T>(reader);
    //    t = list.FirstOrDefault();
    //    //if (reader.Read())//表示有数据  开始读
    //    //{
    //    //    foreach (var prop in type.GetProperties())
    //    //    {
    //    //        prop.SetValue(t, reader[prop.Name] is DBNull ? null : reader[prop.Name]);
    //    //    }
    //    //}
    //}
公開された43元の記事 ウォンの賞賛8 ビュー3915

おすすめ

転載: blog.csdn.net/MaYang_/article/details/103748250