是否有可能使抽象方法的参数列表具有可覆盖的长度和类型?

时间:2011-01-29 19:07:41

标签: c# parameters methods override

是否可以创建如下所示的基类:

 public abstract class baseClass
{
     public abstract void SetParameters(/*want this to be adjustable*/);
}

以便覆盖它的类可以定义所需的参数? 换句话说,我想强制重写该方法,但是将它留给覆盖类,这里需要什么 - 所以可能是

 public class derivedClass1 : baseClass
{
     public override void SetParameters(Point a, int b);
}

而另一个可能是

 public class derivedClass2 : baseClass
{
     public override void SetParameters(List<Line> a, Point b, Point c, bool e);
}

感谢您提供任何帮助

3 个答案:

答案 0 :(得分:10)

绝对不是 - 这将首先打破抽象方法的一半 - 没有人可以调用它,因为他们不知道实际写了哪个方法签名。抽象类的重点是客户端可以具有类型BaseClass的引用,而无需关心实际实现的类型。

如果基类能够预先预测可能涉及哪些类型,那么使调用者的生活更轻松的一种可能性是将最一般的签名(通常是具有最多参数的签名)抽象,并进行各种重载调用,其中一般为客户未指定的参数提供默认值。

答案 1 :(得分:0)

不,这是不可能的。覆盖方法需要精确匹配参数 - 它与实现接口相同。您可能对double-dispatch模式感兴趣。

答案 2 :(得分:0)

如果参数全部设置为相同的类型并且我猜是相同的数字(不确定是否可以使用参数T [],可以这样做,但如果它可能,那么你也可以调整它)。你可以通过使用Generics来实现,比如@ simonalexander2005所说的

public abstract class baseClass<T> where T : class
{
     public abstract T SetParameters(params T[] parameters);
}

由您决定派生类将使用多少参数。但是,我不确定它是否是一个好的做法...