6

抽象基本クラスがあります。

この基本クラスから派生したクラスが 2 つあります。

とにかく、私のクラスの 1 つが抽象的なオーバーライドの使用法で文字列パラメーターを無視できるということはありますか? それとも、空白のものを送信して無視する必要がありますか? (可読性をわずかに低下させる)

次の派生クラスの両方がコンパイルされるように、何らかのオプションのパラメーターを持つ関数を 1 つ持つことはできますか?

PS - 次のコードは、私がやりたいことの例として、コンパイルできないコードでいっぱいです

PS PS - はい、既に次のコードをコンパイルしています - 結果については上記のコメントを参照してください

public abstract class MyBaseClass
{                                            //optional string?
    public abstract void FunctionCall(int i, string s = "");
}

public class MyDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i)
    {
        MessageBox.Show(i.ToString());
    }
}

public class YourDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i, string s)
    {
        MessageBox.Show(s + " " + i.ToString());
    }
}
4

3 に答える 3

8

FunctionCall を抽象化する必要がまったくない場合は、2 つのバージョンを宣言できます。

public abstract class MyBaseClass
{
    public virtual void FunctionCall(int i)
    {
        this.FunctionCall(i, "");
    }
    public virtual void FunctionCall(int i, string s)
    {

    }
}

public class MyDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i)
    {
        MessageBox.Show(i.ToString());
    }
}

public class YourDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i, string s)
    {
        MessageBox.Show(s + " " + i.ToString());
    }
}

それ以外の場合、実装を確実にするために抽象化する必要がある場合でも、2 つのバージョンを追加できます。これは、継承をより冗長にするだけです。

public abstract class MyBaseClass
{
    public abstract void FunctionCall(int i);
    public abstract void FunctionCall(int i, string s);
}

public class MyDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i, string s)
    {
        throw new NotImplementedException();
    }
    public override void FunctionCall(int i)
    {
        MessageBox.Show(i.ToString());
    }
}

public class YourDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i)
    {
        throw new NotImplementedException();
    }
    public override void FunctionCall(int i, string s)
    {
        MessageBox.Show(s + " " + i.ToString());
    }
}
于 2013-11-05T22:59:09.613 に答える