1

顧客データを収集してデータベースに入力するための簡単な Web フォームを作成しています。、、、、および抽象クラスから継承する5 つCustomerのサブクラスがあります。 機能があります。id パラメータは Customers テーブルの主キー (Bank、Employee、Owner、および TradeReference は Customer と多対 1 の関係にあります) であるため、ID を挿入する必要はありません (CustomerID はデータベースで自動インクリメントされます)。 )。 BankEmployeeOwnerTradeReferenceDataEntryDataEntrypublic void InsertSelfIntoDataBase(int id);Customer

現在、私のコードは、 、 、 、および が親クラスに関数を実装し、 NotImplementedException をスローするように設定されているBankためEmployeeOwnerクラスコードTradeReferenceのコードは次のようになります。InsertSelfIntoDataBaseCustomerCustomer

public int InsertSelfIntoDataBase()
{
    int customerID = InsertCustomerAndReturnScalor();
    return customerID;
}


public override void insertSelfIntoDataBase(int id)
{    throw new NotImplementedException("Customer does not use this function");    }

この実装は機能しますが、NotImplementedException を使用しなければならないことが気になります。私の大学の教授がどういうわけか知っていて、静かに私を判断しているという感覚を揺るがすことができないように. これを行うより良い方法はありますか?

4

2 に答える 2

5

ロバート・コロンビアが指摘したように、クラスの設計に関する警告に関係なく、私はNotImplementedException.

.NET Framework には、この目的により適した別のよく知られた例外がありますNotSupportedException。これは、操作が実装によってサポートされていないことを示しています。機能を実装するコードの欠如ではなく、設計によるものです。

これNotImplementedExceptionはむしろ、実装が将来行われる予定であり、行われるべきであることを示す指標です。

于 2016-08-29T15:27:01.397 に答える
2

このような状況は、抽象クラス モデルが理想的ではないことを示している可能性があります。おそらくDataEntry、メソッドなしで抽象クラスを実装してから、メソッドを実装するかどうかに応じて具体的なクラスがいずれかから継承できるように、抽象メソッドを定義するinsertSelfIntoDataBase(int)ような 2 番目の抽象クラスを派生させることができます。SelfInsertingDataEntry : DataEntryinsertSelfIntoDataBase(int)

このトリックを使用すると、具体的なインスタンス (実装されているかどうかにかかわらずinsertSelfIntoDataBase) を type にキャストできるため、他のメソッドに関連するポリモーフィズムが保持されますDataEntry

@Recursive もコメントに良い点があり、insertSelfIntoDataBaseメソッドをインターフェイスに移動することを提案しました。次に、DataEntryクラス階層を Entry タイプの分類法に厳密に関連付けたままにして、親を切り替える必要なく、一部の、またはまったく、またはすべての子孫が必要に応じてインターフェイスを実装または実装しないようにすることができます。

于 2016-08-29T15:13:13.927 に答える