Необязательные параметры и наследование - PullRequest
6 голосов
/ 11 ноября 2011

Я понимаю необязательные параметры, и они мне очень нравятся, но я бы хотел немного больше узнать об их использовании с унаследованным интерфейсом.

Приложение A

interface IMyInterface
{
    string Get();
    string Get(string str);
}

class MyClass : IMyInterface
{
    public string Get(string str = null)
    {
        return str;
    }
}

Теперь я бы подумал, что метод Get в MyClass наследует оба метода интерфейса, но ...

'MyClass' не реализует элемент интерфейса'MyInterface.Get ()'

Есть ли для этого веская причина?

Может быть, я должен пойти на это, добавив необязательные параметры в указанный вами интерфейс?Но что по этому поводу?

Приложение B

interface IMyInterface
{
    string Get(string str= "Default");
}

class MyClass : IMyInterface
{
    public string Get(string str = "A different string!")
    {
        return str;
    }
}

И этот код прекрасно компилируется.Но это не может быть верно, конечно?Затем, немного покопавшись, я обнаружил следующее:

  IMyInterface obj = new MyClass();
  Console.WriteLine(obj.Get()); // writes "Default"

  MyClass cls = new MyClass();
  Console.WriteLine(cls.Get()); // writes "A different string!"

Может показаться, что вызывающий код получает значение необязательного параметра на основе объявленного типа объектов, а затем передает его методу,Мне кажется, это немного глупо.Может быть, у необязательных параметров и перегрузок методов есть свои сценарии, когда их следует использовать?

Мой вопрос

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

Буду ли я вынужден применять одну и ту же перегрузку метода в каждой реализации?

public string Get()
{
  return Get("Default");
}

1 Ответ

1 голос
/ 11 ноября 2011

Что я также не осознавал, так это то, что необязательные параметры не меняют сигнатуру метода . Таким образом, следующий код является абсолютно законным и фактически был моим решением:

interface IMyInterface
{
    string Get(string str = "Default");
}

class MyClass : IMyInterface
{
    public string Get(string str)
    {
        return str;
    }
}

Так что, если у меня есть экземпляр MyClass, я должен вызвать Get(string str), но если этот экземпляр был объявлен в качестве базового интерфейса IMyInterface, я все равно могу вызвать Get(), который получает значение по умолчанию из IMyInterface сначала, затем вызывает метод.

...