У меня есть интерфейс:
public interface IHello {}
У меня есть 2 класса:
public class A : IHello
{
public void Method1()
{
...
}
}
public class B : IHello
{
}
Когда я делаю вызов Method1(), я получаю следующую ошибку:
public class C
{
private IHello obj123;
static void Main()
{
obj123 = new A();
obj123.Method1(); // Method1 does not exist in IHello
}
}
Я так понимаю, что obj123 имеет тип IHello. Я хочу сделать что-то вроде (GetTypeof(Ihello)).Method1 существует? Тогда позвони
Как этого добиться?
@Dmitry Дмитрий, у меня есть некоторые ограничения, чтобы этого не делать.
Хорошо, в настоящее время я сделал это решение, но оно не выглядит аккуратно. Приветствуются любые другие улучшения: if (obj123 is A) { (obj123 as A).Method1(); }
Если вам нужны хорошие ответы, вам нужно объяснить, что это за ограничения. использование is A, безусловно, возможно. Но лучшее решение для реального примера — указать правильный тип поля, то есть private A obj123.





Вы можете попробовать выполнить приведение к A, например, с оператором as-operator:
obj123 = new A();
A a = obj123 as A;
a?.Method1(); // if a is null this does nothing
? — это нулевой условный оператор.
if (obj123 is A a)
{
a.Method1();
}
Обратите внимание, что этот тип выборочного приведения часто рассматривается как плохой дизайн ООП. Вы, вероятно, не должны слишком полагаться на это и вместо этого найти дизайн, в котором это не обязательно.
Объявление метода должно быть на интерфейсе. Обновите свой интерфейс следующим образом:
public interface IHello
{
void Method1();
}
Класс A и класс B должны будут реализовать Method1(), если они хотят реализовать IHello.
Возможно, вы захотите уточнить, чего вы пытаетесь достичь. Если класс B не должен реализовывать Method1, то либо используйте отдельные интерфейсы, либо объявите переменную как:
private A obj123;
Почему у вас
IHelloпусто? Пусть объявляетMethod1