QA@IT
«回答へ戻る

回答を投稿

Class2とClass3が少なからず関係している前提で密結合になって構わないのならば
aa(int, string)をClass2でsealedしてしまうのもアリかもしれません。
継承の前後関係がごちゃごちゃするのでスマートではないかもしれませんが、
Class3からaa(int, string)の呼出しは不可能です。

Class1に存在するメソッドをClass3から呼び出し、その結果、aa(int, string)が
呼び出されるようなものがある場合を想定してですが。

そもそもClass1やClass3からaa(int, string)が呼び出される想定のものでないならば、
ledsunさんの回答通りの書き方がスマートでしょう。

abstract public class Class1
{
    abstract public int aa(int a);
    abstract public int aa(int a, string b);

    public void hoge()
    {
        aa(999);
    }

    public void fuga()
    {
        aa(999, "Class1::fuga()");
    }
}

public class Class2 : Class1
{
    public override int aa(int a)
    {
        hoge();
        fuga();
        return aa(a, "Class2::aa()");
    }

    public override sealed int aa(int a, string b)
    {
        hoge();
        fuga();
        MessageBox.Show(a.ToString(), b);
        return a;
    }
}

public class Class3 : Class2
{
    public override int aa(int a)
    {
        aa(123);
        aa(a, "Class3::aa()");
        hoge();
        fuga();
        return a;
    }
}
Class2とClass3が少なからず関係している前提で密結合になって構わないのならば
aa(int, string)をClass2でsealedしてしまうのもアリかもしれません。
継承の前後関係がごちゃごちゃするのでスマートではないかもしれませんが、
Class3からaa(int, string)の呼出しは不可能です。

Class1に存在するメソッドをClass3から呼び出し、その結果、aa(int, string)が
呼び出されるようなものがある場合を想定してですが。

そもそもClass1やClass3からaa(int, string)が呼び出される想定のものでないならば、
ledsunさんの回答通りの書き方がスマートでしょう。


```C#
abstract public class Class1
{
    abstract public int aa(int a);
    abstract public int aa(int a, string b);

    public void hoge()
    {
        aa(999);
    }

    public void fuga()
    {
        aa(999, "Class1::fuga()");
    }
}

public class Class2 : Class1
{
    public override int aa(int a)
    {
        hoge();
        fuga();
        return aa(a, "Class2::aa()");
    }

    public override sealed int aa(int a, string b)
    {
        hoge();
        fuga();
        MessageBox.Show(a.ToString(), b);
        return a;
    }
}

public class Class3 : Class2
{
    public override int aa(int a)
    {
        aa(123);
        aa(a, "Class3::aa()");
        hoge();
        fuga();
        return a;
    }
}
```