6

我有一个抽象基类。

我有 2 个来自这个基类的派生类。

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

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

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 是抽象的,你可以声明它的两个版本:

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

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

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 回答
3

它将引发编译错误:“未实现抽象继承成员'MyBaseClass.FunctionCall(int, string)'”。

所以不,简短的回答是你不能这样做。

相反,您必须进行方法重载并实现两个抽象方法。

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 = "") { }

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

    public override void FunctionCall(int i) {}
}

然而,这似乎很混乱。也许最好的选择是始终使用可选参数,如果不需要,则根本不传递值,或者像您似乎已经在做的那样处理它。

public class MyDerivedClass : MyBaseClass
{
    public override void FunctionCall(int i, string s = "") 
    {
        if (!string.IsNullOrEmpty(s))
            MessageBox.Show(i.ToString());
        else
           // handle other path here
    }
}
于 2013-11-05T22:54:28.740 回答
3

一种可能的方法是使用扩展方法来添加缺失的覆盖(这也适用于接口)

static class MyBaseClassExtensions
{
       public void FunctionCall(MyBaseClass this item, int i)
       {
            item.FunctionCall(i, null);
       }
}
于 2013-11-05T23:04:10.070 回答