Разрешено ли классу реализовывать интерфейс плюс дополнительные частные методы в C #? - PullRequest
1 голос
/ 27 мая 2011

У меня есть следующий интерфейс :

interface IExcelServices
{
    Dictionary<string, string[]> FilterFields(Dictionary<string, string[]>  excelContent);
    Dictionary<string, string[]> ParseExcelFile(string path);
}

, который реализуется следующим классом :

public class ExcelServices : IExcelServices
{
    public Dictionary<string, string[]> FilterFields(Dictionary<string, 
       string[]>  excelContent)
    {
        //somecode
    }

    public Dictionary<string, string[]> ParseExcelFile(string path)
    {
        //somecode
    }

    private void ReleaseObject(object obj)
    {
        //somecode
    }

}

Мой код компилируется без проблем, но мне было интересно, является ли добавление закрытого метода (или вообще любого метода), которого нет в определении интерфейса, хорошая практика программирования ОО или нет.

Спасибо
Франческо

Ответы [ 5 ]

9 голосов
/ 27 мая 2011

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

4 голосов
/ 27 мая 2011

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

2 голосов
/ 27 мая 2011

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

public Dictionary<string, string[]> FilterFields(...)

или

Dictionary<string, string[]> IExcelServices.FilterFields

Ваш текущий код не будет скомпилирован, так как видимость по умолчанию для методов private.

1 голос
/ 27 мая 2011

Для меня это по умолчанию : реализация какого-либо интерфейса обеспечивает уверенность, что другие могут использовать ваш класс простым способом, и что ваш объект (класс) можно рассматривать как отдельные части (интерфейсы).
Но для работы класса могут потребоваться дополнительные операции, которые вы реализуете с помощью частных методов.
Будьте осторожны: методы, реализующие интерфейсы, методы ДОЛЖНЫ БЫТЬ public !!

1 голос
/ 27 мая 2011

Хорошая практика программирования OO не помешает реализации за пределами интерфейса.На самом деле, цель интерфейса - дополнить остальные реализации классов.

EDIT

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

...