none
Как вызвать метод интерфейса? RRS feed

  • Вопрос

  • Приветствую.

    Начал изучать C# и возникла у меня проблема с интерфейсами.

    Пример:

    Я создал сборку (dll)

    using System;
    
    namespace ClassLibrary
    {
        public interface ITest
        {
            void OpenDoor();
            void CloseDoor();
        }
        class Class: ITest
        {
            public void OpenDoor()
            {
                Console.WriteLine("Дверь открыта");
            }
            public void CloseDoor()
            {
                Console.WriteLine("Дверь закрыта");
            }
        }
    }

    Потом создал консольный проект, добавил ссылку на эту dll и пытаюсь вызвать ее методы.

    using System; using ClassLibrary; namespace Test { class Program { static void Main(string[] args) { ITest Test; Test.OpenDoor(); Test.CloseDoor();

    Console.ReadKey(); } } }

    И вот тут проблема. Как их вызвать если класс реализующий Itest закрытый? Если методы интерфейса нельзя вызвать без создания экземпляра реализующего класса, то какой смысл в интерфейсах?

    Спасибо!

    7 февраля 2014 г. 8:57

Ответы

  • "И вот тут проблема. Как их вызвать если класс реализующий Itest закрытый?" - никак. Интерфейс, это просто конракт. Без экземпляра класса его реализующего – не получится вызвать его.

    "Если методы интерфейса нельзя вызвать без создания экземпляра реализующего класса, то какой смысл в интерфейсах?" - продолжайте изучать дальше, потом поймёте. Если кратко и внятно – он нужен для реализации полиморфизма (трудно в начале понять, что это такое, постепенно поймёте).


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Dmitriy Schleht 7 февраля 2014 г. 9:33
    7 февраля 2014 г. 9:10
    Модератор
  • А зачем Вам в сборке закрытый класс? Ладно, допустим. Тогда если Вы хотите использовать именно свой закрытый класс, то в любом случае в Вашей библиотеке должен быть открытый класс в котором будет создаваться экземпляр типа Class и отдаваться "наружу" как ITest.

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

    ITest Test = new Class();

    А какой смысл... В .NET интерфейсы ввели для отхода от множественного наследования, который был в C++.

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

    Так же, интерфейсы широко используются в DependencyInjection для избавления от прямых зависимостей в коде.

    В пример из чего-то реального можно привести логирование в приложении. Есть определенный интерфейс с методами "записать, отправить" и тд. В коде мы везде будем использовать именно интерфейс, подставив нужную реализацию, а когда необходимо будет сменить логирование, то подставим другую реализацию и всё, больше ничего менять не нужно, т.к. интерфейс остался прежний.

    Почитайте литературу, т.к. у меня слишком грубый пример получился, лично мне трудно объяснить парой предложений что такое интерфейс и с чем его едят.


    • Изменено Oleg Kurzov 7 февраля 2014 г. 9:21
    • Помечено в качестве ответа Dmitriy Schleht 7 февраля 2014 г. 9:33
    7 февраля 2014 г. 9:19
  • Самое простое:

    public static class TestFactory
    {
         public static ITest GetInstance()
         {
             return new Class();
         }
    }

    А в действительности используют Inversion of control, в интернете много статей про это.

    Суть его в том, что мы связываем интерфейс и тип, а когда нам нужен объект, то мы просто указываем интерфейс. В нем же можно еще указывать возвратится ли нам синглтон-объект или новый инстанс.


    • Помечено в качестве ответа Dmitriy Schleht 7 февраля 2014 г. 10:50
    7 февраля 2014 г. 10:37

Все ответы

  • "И вот тут проблема. Как их вызвать если класс реализующий Itest закрытый?" - никак. Интерфейс, это просто конракт. Без экземпляра класса его реализующего – не получится вызвать его.

    "Если методы интерфейса нельзя вызвать без создания экземпляра реализующего класса, то какой смысл в интерфейсах?" - продолжайте изучать дальше, потом поймёте. Если кратко и внятно – он нужен для реализации полиморфизма (трудно в начале понять, что это такое, постепенно поймёте).


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа Dmitriy Schleht 7 февраля 2014 г. 9:33
    7 февраля 2014 г. 9:10
    Модератор
  • А зачем Вам в сборке закрытый класс? Ладно, допустим. Тогда если Вы хотите использовать именно свой закрытый класс, то в любом случае в Вашей библиотеке должен быть открытый класс в котором будет создаваться экземпляр типа Class и отдаваться "наружу" как ITest.

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

    ITest Test = new Class();

    А какой смысл... В .NET интерфейсы ввели для отхода от множественного наследования, который был в C++.

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

    Так же, интерфейсы широко используются в DependencyInjection для избавления от прямых зависимостей в коде.

    В пример из чего-то реального можно привести логирование в приложении. Есть определенный интерфейс с методами "записать, отправить" и тд. В коде мы везде будем использовать именно интерфейс, подставив нужную реализацию, а когда необходимо будет сменить логирование, то подставим другую реализацию и всё, больше ничего менять не нужно, т.к. интерфейс остался прежний.

    Почитайте литературу, т.к. у меня слишком грубый пример получился, лично мне трудно объяснить парой предложений что такое интерфейс и с чем его едят.


    • Изменено Oleg Kurzov 7 февраля 2014 г. 9:21
    • Помечено в качестве ответа Dmitriy Schleht 7 февраля 2014 г. 9:33
    7 февраля 2014 г. 9:19
  • какой смысл в интерфейсах?

    Интерфейсы пришли в .NET из технологии COM (по крайней мере, я с ними впервые познакомился там). Идея интерфейса состоит в том, чтобы один раз описать способ взаимодействия с объектами РАЗНЫХ классов, реализующих данный интерфейс. Объекты классов, таким образом, становятся взаимозаменяемыми: можно убрать один, а на его место поставить другой. Способ взаимодействия с объектами из основного кода остается неизменным. Интерфейс - важное понятие для построения приложений из взаимозаменяемых компонентов.

    Кроме того, взаимодействие при помощи интерфейсов позволяет скрыть внутреннее устройство классов, реализующих данный интерфейс. Но, как Вам уже правильно заметили, должна быть "фабрика" объектов класса -  код, создающий объекты класса. Это может быть произвольный метод произвольного класса (даже статический), который возвращает ссылку на интерфейс.


    • Изменено kosuke904 7 февраля 2014 г. 9:45
    • Предложено в качестве ответа Oleg Kurzov 7 февраля 2014 г. 9:54
    7 февраля 2014 г. 9:44
  • в Вашей библиотеке должен быть открытый класс в котором будет создаваться экземпляр типа Class и отдаваться "наружу" как ITest.

    А приведите пожалуйста примерчик кода как это реализовать, а именно как отдать наружу экземпляр.

    Спасибо!

    7 февраля 2014 г. 9:57
  • Самое простое:

    public static class TestFactory
    {
         public static ITest GetInstance()
         {
             return new Class();
         }
    }

    А в действительности используют Inversion of control, в интернете много статей про это.

    Суть его в том, что мы связываем интерфейс и тип, а когда нам нужен объект, то мы просто указываем интерфейс. В нем же можно еще указывать возвратится ли нам синглтон-объект или новый инстанс.


    • Помечено в качестве ответа Dmitriy Schleht 7 февраля 2014 г. 10:50
    7 февраля 2014 г. 10:37
  • Отличный мануал получился. Подскажите еще про делегаты, зачем их использовать, если можно и без них обоитись
    7 февраля 2014 г. 12:59