Метод класса, который не находится в интерфейсе

У меня есть простой вопрос С# (так я считаю). Я новичок в этом языке, и у меня возникла проблема с интерфейсами и классами, которые их реализуют. Проблема заключается в

У меня есть интерфейс iA

interface iA
{
  bool method1
  bool method2
  bool method3
}

и 3 класса, которые реализуют интерфейс: class B, C и D

class B : iA
{
  public bool method1
  public bool method2
  public bool method3
}

если класс B имел другой метод, который не находится в интерфейсе, скажем method4(), и у меня есть следующее:

iA element = new B();

а затем я буду использовать:

element.method4();

Я бы получил ошибку, заявив, что у меня нет method4(), который принимает первый аргумент типа iA.

Вопрос: могу ли я иметь объект типа интерфейса и создать экземпляр класса с тем, чтобы этот объект вызывал метод из класса, метод, который не находится в интерфейсе?

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

Ответ 1

Вы должны указать тип интерфейса для типа класса; обычно мы делаем это с помощью как:

  B b = element as B; // <- try cast element as B

  if (!Object.RefernceEquals(null, b)) { // <- element is B or can be legaly interpreted as B
    b.method4(); 
  }

Преимущество "как" заключается в том, что существует только одна операция литья, а "есть" и (B) - сделать две приведения.

Ответ 2

Да, это возможно. Вам просто нужно указать тип интерфейса для типа класса следующим образом:

iA element = new B();
((B)element).method4();

Как было предложено wudzik, вы должны проверить правильность типа elemnt:

if(element is B)
{
    ((B)element).method4();
}

Ответ 3

Без кастинга вы можете сделать это.

interface iA
{
  bool method1();
  bool method2();
  bool method3();
}

interface IFoo : iA
{
  bool method4();
}

class B : IFoo
{
  public bool method1() {}
  public bool method2() {}
  public bool method3() {}
  public bool method4() {}
}

IFoo element = new B();    
element.method4();

Примечание. Попробуйте использовать префикс капитала I для интерфейсов С#.