Используя интерфейсы на абстрактных классах в C#

Мне удалось добиться этого, используя настройки файла манифеста вместо использования кода, чтобы повлиять на значок и цвет для использования.

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_icon"
android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. -->
<meta-data
android:name="com.google.firebase.messaging.default_notification_color"
android:resource="@color/colorAccent" />
20
задан JubJub 26 March 2009 в 01:58
поделиться

3 ответа

Вы сталкиваетесь с проблемой, потому что Вы использовали явную интерфейсную реализацию (EII). Когда участник явно реализован, к этому нельзя получить доступ через экземпляр класса - только через экземпляр интерфейса. В Вашем примере вот почему Вы не можете звонить DoCool() если Вы не бросаете свой экземпляр к IDoesCoolThings.

Решение состоит в том, чтобы сделать DoCool() общественность и удаляет явную интерфейсную реализацию:

public abstract class AbstractWidget : IDoesCoolThings
{
    public void DoCool()      // DoCool() is part of the abstract class implementation.
    {
        Console.Write("I did something cool.");
    }
}

// ...

var rw = new RealWidget();
rw.DoCool();                  // Works!

В целом Вы используете EII в двух случаях:

  • У Вас есть класс, который должен реализовать два интерфейса, каждый из которых содержит участника, который имеет идентичное имя/подпись к другому участнику в другом интерфейсе.
  • Вы хотите вынудить клиенты не зависеть от деталей реализации Вашего класса, а скорее в интерфейсе это реализуется Вашим классом. (Это считают хорошей практикой некоторые.)
42
ответ дан 29 November 2019 в 22:58
поделиться

Измените свое объявление на:

public abstract class AbstractWidget : IDoesCoolThings 
{
    public void DoCool()
    { 
        Console.Write("I did something cool."); 
    }
}
8
ответ дан 29 November 2019 в 22:58
поделиться

Путем Вы реализуете интерфейс, явная реализация, пустая IDoesCoolThings. DoCool (), если Вы выбираете неявный интерфейс реализации.

public abstract class AbstractWidget : IDoesCoolThings
{
    public void DoCool()
    {
        Console.Write("I did something cool.");
    }
}

Затем это будет работать.

Чтение это:

Интерфейсы C#. Неявная реализация по сравнению с Явной реализацией

7
ответ дан 29 November 2019 в 22:58
поделиться
Другие вопросы по тегам:

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