2016-09-11 2 views
4

Я хочу создать библиотеку классов, которая содержит интерфейс, из которого могут образовываться объекты, скажем ISaveableObject.C# - Создание сохраняемого объекта

Теперь этот интерфейс должен реализовывать следующие функции:

  • объектов, которые проистекают от этого интерфейса должен иметь метод ToSaveableObject (аналогично методу System.Object.ToString()).
  • И он должен содержать конкретный конструктор, который принимает в качестве параметра массив объектов.

Связь между этими двумя должно быть, что метод ToSaveableObject возвращает строку, которая принимает все свойства, которые необходимы для object[] и преобразовать его в читаемую строку и вернуть его.

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

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

+0

использовать абстрактный базовый класс, который наследуется от вашего предполагаемого интерфейса. Вы хотите больше деталей реализации, которые больше, чем может обеспечить интерфейс. – Nkosi

+1

interfacet no «должен реализовывать», но, возможно, «должен планировать контракт» –

+0

Я не понимаю, что «должен иметь конкретный конструктор». Мир «сберегаемых» или «сериализуемых» решений никогда не требует «конкретного конструктора», многие хотят, по крайней мере, не защищать args ctor. С обсуждением кода будет лучше –

ответ

1

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

абстрактный базовый класс может выглядеть следующим образом

public abstract class SaveableObject { 
    protected object[] parameters = new object[0]; 

    protected SaveableObjectBase(object[] objects) { 
     this.parameters = objects; 
    } 

    public abstract string ToSaveableObject(); 
} 

Так что теперь производные классы должны реализовать метод ToSaveableObject() и будет иметь доступ к объектам, переданных в конструктор для создания строки.

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

+0

Ваш ответ (для меня) является признаком того, что обе половины решения независимы. Вероятно, я напишу аналогичный код, но это результат плохих дизайнерских решений. –

+0

Мне очень нравится это решение. Только один вопрос: можете ли вы также поместить поле 'parameters' в интерфейс? –

+2

@IanH. поля защищены, поэтому их можно получить в классах derrives. Вы можете думать о «readonly» для инициализации один раз и только один раз (первое совпадение неверно) –

Смежные вопросы