Иногда у меня есть интерфейс с параметрами по умолчанию, и я хочу вызвать метод реализации из внутри класса реализации (в дополнение к нему извне). Я также хочу использовать его параметры по умолчанию.
Однако, если я просто вызываю метод по имени, я не могу использовать параметры по умолчанию, потому что они определены только в интерфейсе. Я мог бы повторить спецификации по умолчанию в методе реализации, но это нежелательно из-за СУХОЙ и все, что влечет за собой (особенно тот факт, что компилятор не проверял, что они действительно соответствуют настройкам по умолчанию!)
Я решаю это, введя член с именем _this
, который совпадает с this
, за исключением того, что он объявлен как тип интерфейса. Затем, когда я хочу использовать параметры по умолчанию, я вызываю метод с _this
. Вот пример кода:
public interface IMovable
{
// I define the default parameters in only one place
void Move(int direction = 90, int speed = 100);
}
public class Ball: IMovable
{
// Here is my pattern
private readonly IMovable _this;
public Ball()
{
// Here is my pattern
_this = this;
}
// I don't want to repeat the defaults from the interface here, e.g.
// public void Move(int direction = 90, int speed = 100)
public void Move(int direction, int speed)
{
// ...
}
public void Play()
{
// ...
//This would not compile
//Move();
// Now I can call "Move" using its defaults
_this.Move();
// ...
}
}
Есть ли что-то не так с этим шаблоном или способом решить проблему лучше? (Кстати, я думаю, что это недостаток в языке, который я должен сделать примерно так)
РЕДАКТИРОВАТЬ: Не дублировать Почему дополнительные параметры С# 4, определенные на интерфейсе, не выполняются при реализации класса?... Я прежде всего спрашивая, как обойти эту языковую причуду, а не спрашивать, почему она была разработана именно так.