所以,我有一个带有3个参数的方法的抽象类,它在特定的基类中被重写。
抽象方法采用以下形式:
internal override void SummonJonSkeet(string dumbQuestion, int a, int b)
{
// Call upon Jon Skeet and his followers to correct my ignorant ways.
}
在大多数实现给定方法的子类中,需要所有3个参数来生成正确的结果。但是,在此特定实例中,a和b的唯一有效值为0。
目前我所做的只是忽略方法中的值,并在方法的文档注释中提供警告,但这只是感觉......错了。
必须有一种更好的方法,而不是强迫程序员(好吧,我)将垃圾参数插入到方法调用中以使编译器满意,同时仍然需要为实现该方法的每个其他子类使用这些参数
也许这是一个愚蠢的问题,因为我的解决方案有效,但感觉它并不是一个聪明的方法。例如,一些白痴(可能是我)不应该通过在一开始就没有使用的参数中插入一些荒谬的数字来引起未处理的异常。
答案 0 :(得分:1)
另一个选项(假设您提到参数实际上是可能使用或不使用的坐标)可能只是使值可以为空,默认值为null。
internal override void SummonJonSkeet(string dumbQuestion, int? a = null, int? b = null)
你也必须匹配抽象定义,但这显示了方法。
这允许子类根据其实现来调用SummonJonSkeet("my question")
或SummonJonSkeet("my question", 1, 2)
。然后,期望值的子类可以检查a.HasValue
或a != null
以在预期具有值时参数的值不存在时抛出错误。要获得原始值,只需调用a.Value
。
答案 1 :(得分:0)
您可能会考虑为参数创建类的方法(假设您可能需要这些参数具有特定名称或各种类型)。
public class BasicQuestionParameters { public string DumbQuestion {get;set;} }
然后,您可以将抽象类修改为通用,这需要类型为BasicQuestionParameters的类型。
public abstract class SummonBase<TParams> where TParams : BasicQuestionParameters
{
abstract void SummonJobSkeet(TParams question);
}
现在你可以实现你的子类来定义它需要什么类型的问题参数,只要它们从你的基本类开始。
public class MySummonBasic : SummonBase<BasicQuestionParameters>
{
internal override void SummonJonSkeet(BasicQuestionParameters question) {...}
}
现在,您可以通过继承添加其他参数:
public class HardQuestionParameters : BasicQuestionParameters
{
public int A {get;set;}
public int B {get;set;}
}
然后仅在需要更精炼类型的子类中使用它:
public class HardSummon : SummonBase<HardQuestionParameters>
{
internal override void SummonJonSkeet(HardQuestionParameters question) {...}
}
现在每个子类都拥有它所需的参数,而不管或多或少。这种方法的另一个好处是,如果您发现一组子类需要一个额外的参数(C),您只需要更新需要使用附加参数的子类即可。无需触及只需要基本参数的所有其他子类。
答案 2 :(得分:0)
如果不使用int参数,可以将虚方法的签名更改为:
internal override void SummonJonSkeet(string dumbQuestion, params int[] values)
{
//...
}
通过这种方式,您只能使用字符串参数调用它,如下所示:
this.SummonJonSkeet(dumbQuestion);