質問

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

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

編集:

HasDocumentsの本文は次のようになります。 サブクラス1:

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

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

Subclass2:

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

if (res > 0)
    return true;
else
    return false;
役に立ちましたか?

解決

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

両方のメソッドで明らかにほぼ同じロジックを持っているので、次のようにリファクタリングします:

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);
    }
}

他のヒント

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

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;
}

あなたは言った:

  

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

そうです、スーパークラスに置くことができる一般的なメソッドを持っているように聞こえます。

HasContent()は異なる拡張を行うため、基本クラスに移動しません。2つのメソッドが同じように呼び出されるという事実は、同じことを行うことを意味しません。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top