Метод класса, который не находится в интерфейсе
У меня есть простой вопрос С# (так я считаю). Я новичок в этом языке, и у меня возникла проблема с интерфейсами и классами, которые их реализуют. Проблема заключается в
У меня есть интерфейс 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
для интерфейсов С#.