我有一个抽象的基类。
我有两个来自这个基类的派生类。
无论如何,我的某个类可以忽略抽象覆盖用法中的字符串参数吗? 或者我必须发送一个空白的并忽略它? (使可读性略有下降)
我可以使用一个具有某种可选参数的函数,以便以下两个派生类都可以编译吗?
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());
}
}
答案 0 :(得分: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());
}
}
否则,如果它必须是抽象的以确保它被实现,你仍然可以添加两个版本,它只会让继承者更加冗长:
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());
}
}
答案 1 :(得分:3)
它将抛出一个编译错误:“Abstract Inherited member'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
}
}
答案 2 :(得分:3)
一种可能的方法是使用扩展方法添加缺少的覆盖(也适用于接口)
static class MyBaseClassExtensions
{
public void FunctionCall(MyBaseClass this item, int i)
{
item.FunctionCall(i, null);
}
}