3

2つのサブクラスを持つスーパークラスがあります。2つのサブクラスには、チャプターにコンテンツがあるかどうかをチェックするメソッドがあります。サブクラス1の場合、このメソッドはHasContent(intchapterID)であり、サブクラス2の場合、これはHasContent(intchapterID、intinstitution)です。ご覧のとおり、サブクラス2には追加のパラメーターがあります。両方の方法の目的は同じです。

HasContentメソッドをスーパークラスに入れることを考えていました。あなたは私がこれをする必要があると思いますか?もしそうなら、私はこれをどのように実装する必要がありますか?または、両方のメソッドを独自のサブクラスに配置する方が賢明ですか?

編集:

HasDocumentsの本体は次のようになります。Subclass1:

Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID, mInstitutionID);

if (res > 0)
    return true;
else
    return false;

サブクラス2:

Database DB = new Database();
int res = DB.ExecuteSpRetVal(chapterID);

if (res > 0)
    return true;
else
    return false;
4

4 に答える 4

7

編集:質問の更新に従って更新されました。

両方の方法で明らかにほぼ同じロジックを使用しているので、次のようにリファクタリングします。

abstract class SuperClass
{
    protected bool HasContentImpl(int chapterID, int institution)
    {
        Database db = new Database();
        int result;

        if (institution >= 0) // assuming negative numbers are out of range
            result = db.ExecuteSpRetVal(chapterID, institution);
        else
            result = db.ExecuteSpRetVal(chapterID);

        return result > 0;
    }
}

class SubClass1 : SuperClass
{
    public bool HasContent(int chapterID)
    {
        return base.HasContentImpl(chapterID, -1);
    }
}

class SubClass2 : SuperClass
{
    public bool HasContent(int chapterID, int institution)
    {
        return base.HasContentImpl(chapterID, institution);
    }
}
于 2009-03-09T10:35:26.190 に答える
2

引数が異なる 2 つの同じ名前のメソッドをスーパークラスに配置して、メソッドのオーバーロードを使用します。HasContent を呼び出すと、指定した引数の数とタイプに一致するものが使用されます。これはスーパークラスにあるため、後でこのメソッドも使用する新しいサブクラスを作成することにした場合でも、そのコピーをさらに作成する必要はありません。サンプル コードについては、以下を参照してください。

protected bool HasContent(int chapterID, int institution)
{
    Database db = new Database();
    int result;

    result = db.ExecuteSpRetVal(chapterID, institution);

    return result > 0;
}

protected bool HasContent(int chapterID)
{
    Database db = new Database();
    int result;

    result = db.ExecuteSpRetVal(chapterID);

    return result > 0;
}
于 2009-07-08T00:48:24.263 に答える
0

あなたが言った:

両方の方法の目的は同じです

そうです、スーパークラスに入れることができる共通のメソッドがあるように思えます。

于 2009-03-09T10:33:38.613 に答える
0

HasContent() は異なる拡張を使用するため、基本クラスには移動しません。2 つのメソッドが同じように呼び出されたからといって、それらが同じことを行うわけではありません。

あなたのコードベースやあなたが取り組んでいるシステムが何をしているのかはわかりませんが、私が持っている情報が少ないことを考えると、あなたのデザインについて何かが間違っているように感じます. 過去に、この種の設計上の問題が発生した場合、それはデータがどのようにモデル化されているかという他の問題が原因であることがよくありました。システムの残りの部分を変更できない場合は、ヘルプに一致しないことを申し訳ありません…。

于 2009-03-09T12:34:21.757 に答える