Задать вопрос
kykyryky
@kykyryky

Как вызывать метод производного класса, не объявленного в интерфейсе?

Есть следующая структура классов:

interface IBase
    {
        void Method();
    }
    class Derived : IBase
    {
        public void Method() //реализация метода из интерфейса
        {
            Console.WriteLine("Вызван метод, определенный в интерфейсе");
        }
        public void MethodOnlyForDerivedClass() //определение метода, нужного только в Derived
        {
            Console.WriteLine("Вызван метод, определенный в классе");
        }
    }


Main:

static void Main(string[] args)
        {
            IBase instance1 = new Derived();

            //так
            Derived instance2 = (Derived)instance1;
            instance2.MethodOnlyForDerivedClass();

            //или так
            ((Derived)instance1).MethodOnlyForDerivedClass();
        }


Как построить иерархию, чтобы вызывать методы только производного класса было проще? Например так:
IBase instance1 = new Derived();
instance1.MethodOnlyForDerivedClass();
  • Вопрос задан
  • 274 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
GavriKos
@GavriKos
Если метод не объявлен в классе/интерфейсе - его никак нельзя вызвать снаружи. Разве что потомков рефлексией доставать, но это уже будет другой класс.
В вашем случае есть два варианта - объявить метод в интерфейсе либо переменную instance1 делать типа Derived. Можно еще приведение типов делать, но это багоопасно
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@dmitryKovalskiy
программист средней руки
Можно конечно что-то такое
var instance2 = instance1 as needClass
if(instance2 !=null)
{
instance2.doSomething();
}

Но идея ниже среднего. Отойдите от сферической задачи в вакууме и сформулируйте проблему. Тогда может найдется красивое решение
Ответ написан
@ashumkin
системный разработчик
*выше писал с мобилы, так что добавлю подробнее:
interface IFileStorage {
  void LoadFromFile();
}
interface IExcelCellWriter {
  void SetToCell(int i, int j, string value);
}
class ExcelStorage : IFileStorage, IExcelCellWriter
{
...
}

а дальше юзать:
IFileStorage fs = new ExcelStorage
IExcelCellWriter xcw = fs as IExcelCellWriter;
if (xcw != null)
{
  xcw.SetToCell(...
  ...
}


З.Ы. Я не пишу на С#, так что смотрел "приведение к другому интерфейсу" тут
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы