Вопрос

У меня есть интерфейс (назовем его IMessage), в котором есть метод Check(), класс реализует этот интерфейс.

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    #region IMessage Members

    public bool Check()
    {
        //Some logic
    }
}

Все в порядке.Проблема в том, что я не хочу, чтобы этот метод (Check()) был общедоступным, я хочу сохранить его внутренним для сборки, но если я сделаю его внутренним, компилятор скажет, что он не реализует интерфейс.Для реализации интерфейса он должен быть общедоступным.Что я могу сделать?

Это было полезно?

Решение

Вы можете реализовать метод интерфейса, не делая его частью прямого открытого интерфейса класса, используя явный синтаксис реализации интерфейса ( удаление квалификатора доступа и префикс имени интерфейса к методу ):

interface IMessage
{
    bool Check();
}

class NewClass : IMessage
{
    bool IMessage.Check()  { }
}

Однако любой, кто может выполнить бросок в IMessage интерфейс все еще может вызывать Check().Это не способ предотвратить вызов метода — это всего лишь способ навести порядок в общедоступном интерфейсе класса.Если интерфейс является внутренним для вашей сборки, то только классы в этой сборке могут привести к нему и вызвать метод.

В общем, .NET не предлагает способа сделать только определенный метод интерфейса внутренним для реализации интерфейса.Это одна из областей, где вы можете рассмотреть возможность использования абстрактного базового класса — там вы можете создавать защищенные абстрактные методы, которые наследники могут реализовать, не раскрывая их внешним вызывающим объектам.Например:

abstract class MessageBase
{
    protected abstract bool Check();
}

class NewClass : MessageBase
{
    protected override bool Check() { ... }
}

Другие советы

Интерфейсы — это то, как другие объекты публично взаимодействуют с объектами этого типа.Если другие классы не должны иметь доступ к Check() метод, то это не должно быть частью интерфейса.

Вот обсуждение MSDN этой темы, которая может быть полезна.

class NewClass : IMessage
{
    #region IMessage Members

    internal bool Check()
    {
        //Some logic
    }
    bool IMessage.Check()
    {
        return this.Check();
    }
}

Это обеспечивает внутреннюю реализацию, доступную только классам внутри этой сборки, плюс явная реализация интерфейса что позволяет удовлетворить требования интерфейса.Чтобы код из внешней сборки вызывал Check метод, для этого потребуется IMessage ссылка на ваш класс, а не на NewClass ссылка.

Альтернативно вы можете использовать абстрактный метод базового класса:

public abstract class Message
{
    internal abstract bool Check();
}

public class MyMessage : Message
{
    internal override bool Check()
    {
        // do stuff
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top