抽象方法中的可选参数?可能吗?

jor*_*dan 1 c# class derived-class abstract optional-parameters

我有一个抽象基类。

我有2个从该基类派生的类。

无论如何,我的类之一可以忽略抽象覆盖用法中的string参数吗? 还是我只需要发送一个空白的邮件而忽略它?(使可读性略有下降)

我是否可以使用一个具有某种可选参数的函数,以便以下两个派生类都可以编译?

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

com*_*ech 6

如果您绝对不需要FunctionCall是抽象的,则可以声明它的两个版本:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

否则,如果必须抽象它以确保实现,您仍然可以添加两个版本,这只会使继承者更加冗长:

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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不客气。使它们成为虚拟的主要缺点是继承者不再需要实现它们。这对您的应用程序的影响完全取决于这些方法的功能以及该类是否会被外部调用者使用。我的首选方法,仅仅是因为冗长,是将它们实现为虚拟并在基类中抛出未实现的异常。通过适当的单元测试,这将与将它们声明为抽象具有相同的效果。 (2认同)