Как применить закрытый метод, поскольку методы интерфейса являются только публичными - PullRequest
5 голосов
/ 23 апреля 2011

Интерфейс может использоваться для принудительной реализации методов, но они должны быть общедоступными.

Что если я захочу применить частные методы тогда?

Обновление: речь идет не о предотвращении вызова, этоо том, что приватный метод был РЕАЛИЗОВАН.

Так что я не хочу использовать интерфейс как таковой.Я хочу навязать команде какой-то стиль кодирования.

Ответы [ 6 ]

9 голосов
/ 23 апреля 2011

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

public abstract class A
{
    protected abstract void Foo();
}

public class B : A
{
    protected override void Foo() { }
}

Вышеприведенный код прекратится, если вы попытаетесьизменить Foo модификатор доступа в B или забыть предоставить реализацию для Foo() в B.

Редактировать:

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

public interface IFooWorker
{
    void DoWork();
    int CalculateSomething();
}

public class Foo
{
    private FooWorker _worker;
    private int _currentValue;
    private string _workStatement;


    public Foo()
    {
        _worker = new FooWorker(this);
    }

    private class FooWorker : IFooWorker
    {
        private Foo _outer;
        public FooWorker(Foo foo)
        {
            _outer = foo;
        }

        public void DoWork()
        {
            _outer._currentValue = CalculateSomething();
            _outer._workStatement = "I did work";
        }

        public int CalculateSomething()
        {
            return 42;
        }
    }

}
4 голосов
/ 23 апреля 2011

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

2 голосов
/ 23 апреля 2011

Для всех намерений и целей приватный метод не существует для кода вне класса, который его содержит. Это можно найти с помощью рефлексии, но ... весь смысл частного видения - это то, что не является частью API объектов. Закрытый член явно не является частью контракта объектов, это что-то инкапсулированное в нем.

Почему вы пытаетесь заставить других разработчиков "следовать стилю кодирования" до этого уровня детализации? Какова цель или желаемый результат?

Говоря об этом с другой стороны, вы пару раз говорили, что хотите "убедиться, что метод реализован" или что-то в этом роде.

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

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

"Частный" метод контракта, на который вы намереваетесь, вряд ли принесет вам плоды и, по моему мнению, противоречит ОО-проекту.

Удачи!

1 голос
/ 23 апреля 2011

По определению, Интерфейсы - это наборы открытых методов. Возможно, вы хотите абстрактный класс.

1 голос
/ 23 апреля 2011

Это не будет "приватно", но вы все равно можете подделать его с явной реализацией интерфейса.

Смотрите это: http://msdn.microsoft.com/en-us/library/ms173157.aspx

Ничто не помешает кому-либо напрямую вызывать ваш методпутем обновления до типа интерфейса.Опять же, частные методы - это детали реализации: они не принадлежат интерфейсу.

0 голосов
/ 23 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...