Можно ли сделать так, чтобы список параметров абстрактного метода имел переопределенную длину и типы? - PullRequest
8 голосов
/ 29 января 2011

Возможно ли создать базовый класс, подобный следующему:

 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 ]

10 голосов
/ 29 января 2011

Абсолютно нет - это сломало бы половину смысла иметь абстрактный метод в первую очередь - никто не мог бы вызвать его, потому что они не знали бы, какая сигнатура метода была фактически написана.Весь смысл абстрактного класса заключается в том, что клиент может иметь ссылку типа BaseClass, не заботясь о том, что является типом фактической реализации.

Если базовый класс способен заранее предсказать, какие типыВозможно, одна из возможностей сделать жизнь проще для вызывающего абонента - это иметь абстрактную сигнатуру с наиболее общей (как правило, с наибольшим количеством параметров) и делать различные перегрузки, которые вызывают той самой общей, которая предоставляет значения по умолчанию дляпараметры, которые клиент не указал.

0 голосов
/ 29 января 2011

Это можно сделать, если все параметры были установлены в один и тот же тип и в одно и то же число, я думаю (не уверен, что вы можете использовать параметры T [], но если это возможно, то вы также можете настроить его). Вы можете достичь с помощью Generics, как сказал @ simonalexander2005

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

Вам решать, сколько параметров будет использовать производный класс. Но я не уверен, что это хорошая практика ...

0 голосов
/ 29 января 2011

Нет, это невозможно.Переопределяющий метод должен точно соответствовать параметрам - это то же самое, что и реализация интерфейса.Возможно, вас заинтересует шаблон двойная отправка .

...