Страницы

Поиск по вопросам

суббота, 4 января 2020 г.

Анонимный интерфейс c#

#c_sharp


Есть интерфейс

intefrace IMy {
    void say(String msg);
}


Есть класс

class My {
    IMy iMy;
    public My() {
        iMy = (str) = > Console.WriteLine(str); //ошибка
        iMy.say("Text");
    }
}


На строке с //ошибка мне пишет


  Cannot convert lambda expression to type IMy, because it is not a
  delegate type


Что мне надо изменить в коде, чтобы я мог инициализировать переменную iMy моим способом?

P.S. сам пишу на java, и там такая конструкция работает. Какая аналогичная конструкция
в c#?
    


Ответы

Ответ 1



Судя по примеру использования вместо интерфейса в данном случае можно использовать делегат Action, например так class My { Action iMy; public My() { iMy = (str) => Console.WriteLine(str); //ок iMy("Text"); } }

Ответ 2



Чтобы класс обладал заданным интерфейсом, он должен наследовать этот интерфейс и реализовать методы, которые объявлены в интерфейсе. Ниже показана демонстрационная программа using System; using System.Collections.Generic; namespace Simple_interface { interface IMy { void Say(string msg); } class A1: IMy { public void Say( string msg ) => Console.WriteLine( nameof( A1 ) + ": " + msg ); } class A2: IMy { public void Say(string msg) => Console.WriteLine(nameof( A2 ) + ": " + msg); } class Program { static void Main(string[] args) { List list = new List { new A1(), new A2() }; foreach (var item in list) item.Say("is called"); } } } Ее вывод на консоль A1: is called A2: is called Имейте в виду, что данный кол будет компилироваться для версии C# 6. Вы можете ознакомиться с новыми возможностями C#, посмотрев это видео

Комментариев нет:

Отправить комментарий