2015-09-28 5 views
1

У меня есть класс под названием Package, в этом классе у меня около 10 атрибутов, назовем их 1,2,3,4 .. и т. Д. 10. Этими атрибутами являются strings, ints и некоторые DateTimes. При создании нового объекта пакета иногда мне просто нужно приписывать 1, иногда мне нужно 5, 6 и 9, а иногда мне нужно 3 и 10 и т.д.Должен ли я использовать несколько конструкторов или интерфейс?

Так только два примера: new Package("bla", "bla bla",100) или new Package(2983)

I» ve read:

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

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

EDIT: Я должен, вероятно, упомянуть, что у меня есть некоторые enums к «вид» определить, какие Package это.

+0

потребность, как в вы хотите, чтобы заполнить только те атрибуты или объект будет иметь только те атрибуты? –

+1

Если вы даете свойства класса с помощью геттеров/сеттеров и без конструктора, вы можете сделать 'Пакет p = new Package() p.YourField = ...' или использовать несколько конструкторов – Sybren

+1

Как вы думаете, что интерфейс будет для вас здесь ? Что касается конструкторов, возможно, у вас есть соответствующие подписи? например, 'Package (int, int)', конфликтующий с 'Package (int, int)'? – DavidG

ответ

3

Интерфейс здесь ничем не поможет.

Если вы хотите, чтобы определенные переменные заполнялись вместе, как 1, 2 и 3 всегда должны быть заполнены вместе, а в другом случае достаточно всего 4, вы можете использовать отдельные конструкторы или статические методы с полезными именами, которые создайте объекты (например, CreateFromId, CreateFromNameAndAge).

Если вы не заботитесь вообще, вы можете просто сделать конструктор без параметров (или конструктор с необязательными полями) и установите необходимые поля с инициализаторами объектов:

var x = new Class() { Field1 = 1, Field2 = "2" }; 

Может быть, это знак вы слишком много делают в одном объекте, но без фактической информации о вашем дизайне класса мы не можем этого рассказать.

Наследование, похоже, тоже достойное решение, если пакеты имеют различные виды использования (например, ProductPackage, PersonPackage и т. Д.). Общие свойства находятся в базовом классе, и все специфические свойства могут находиться в классах получения.

+0

. Для этого нужны публичные сеттеры для полей ? – Taemyr

+0

Да, это @Teemyr. Это может быть в порядке в конкретном случае. –

+0

Не могли бы вы обойти это требование с необязательными аргументами в конструкторе? – Taemyr

0

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

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

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

0

Помимо вышеуказанных пунктов, рассмотреть возможность использования Builder шаблон - https://en.wikipedia.org/wiki/Builder_pattern

Вот пример:

class Package 
{ 
    public string Name { get; set; } 
    public string Description { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 

    public static PackageBuilder Create() 
    { 
     return new PackageBuilder(new Package()); 
    } 
} 

class PackageBuilder 
{ 
    private readonly Package _package; 

    public PackageBuilder(Package package) 
    { 
     _package = package; 
    } 

    public PackageBuilder WithName(string name) 
    { 
     _package.Name = name; 
     return this; 
    } 

    public PackageBuilder WithDescription(string description) 
    { 
     _package.Description = description; 
     return this; 
    } 

    public PackageBuilder Prop1(string prop) 
    { 
     _package.Prop1 = prop; 
     return this; 
    } 

    public PackageBuilder Prop2(string prop) 
    { 
     _package.Prop2 = prop; 
     return this; 
    } 

    public static implicit operator Package(PackageBuilder pb) 
    { 
     return pb._package; 
    } 
} 

class Client 
{ 
    Package BuildPackage() 
    { 
     var package = 
      Package.Create().WithName("My Package").WithDescription("Description").Prop1("foo").Prop2("bar"); 
     return package; 
    } 
} 
+0

Пожалуйста, объясните, почему мой ответ был опущен. – olegk

+0

Я не был никем, но ваш ответ можно было бы назвать ответом только для ссылок. Было бы лучше, если бы вы предоставили пример кода, основанный на информации в вопросе, см. [Как ответить] (http://stackoverflow.com/help/how-to-answer) на странице справки. Вероятно, шаблон строителя - хороший ответ. –

+0

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

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