Как реализовать классы, которые используют одинаковые переменные

У меня есть 6 классов, которые все типы документов. Все типы документов имеют одинаковые 8 полей. Есть один класс, который состоит только из этих 8 полей. Остальные классы имеют больше полей. Некоторые из этих классов имеют одинаковые поля (кроме 8 полей).

Пример:

Документ класса: поля с 1 по 8

Форма класса: поля с 1 по 8 и поля с 9 и 10

Класс WorkInstruction: поля с 1 по 8 и поля с 9 и 10

Процедура класса: поля с 1 по 10 и поле 11

Надеюсь, это прояснит мою точку зрения.

Мой вопрос, каков наилучший способ реализовать это? Должен ли я сделать один или несколько интерфейсов, или я должен использовать абстрактные классы?

Thnx

12.12.2008 09:41:48
Что вы подразумеваете под "т / м" в ваших описаниях?
Jon Skeet 12.12.2008 09:44:29
Извините, это нидерландский язык, но я имел в виду, пока. Я отредактировал свой текст, thnx :)
Martijn 12.12.2008 09:56:03
3 ОТВЕТА
РЕШЕНИЕ

Либо сделайте Document базовым типом формы и т. Д., Либо сделайте так, чтобы форма имела дополнительные поля и ссылку на отдельный документ (т. Е. Используйте композицию вместо наследования). В этом случае кажется, что наследование будет лучшим вариантом, но это действительно зависит от того, что вы хотите с ним делать. У вас есть код, который предназначен для работы с любым документом, включая форму, WorkInstruction и т. Д.?

РЕДАКТИРОВАТЬ: например, предположим, у вас есть элемент управления пользовательского интерфейса, который может отображать общие части любого документа - то есть общие 8 полей. Это займет экземпляр документа. Вы можете хотеть , чтобы иметь возможность передать форму или WorkInstruction к нему напрямую - в этом случае лучше извлечь из документа. В качестве альтернативы, при рендеринге Form или WorkInstruction вы можете создать экземпляр элемента управления, передаваемого в части документа отдельно. то есть разница между этим (в C # - вы не указали, какой язык вас интересует):

class Form : Document { ... }

// Later on
Controls.Add(new DocumentDisplay(form));

и это:

class Form
{
    private Document Document { get; set; }
    // Other stuff
}

// Later on
Controls.Add (new DocumentDisplay(form.Document));

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

2
12.12.2008 10:32:44
Да, у меня есть код, который одинаков для любого документа, получателя и установщика. На данный момент цель только для чтения
Martijn 12.12.2008 09:53:44
Это не тот случай, если код реализации одинаков. Есть ли у вас код, который предназначен для использования любого типа документа.
Jon Skeet 12.12.2008 09:56:06
Я не понимаю последнюю часть. Что вы подразумеваете под «иметь возможность использовать любой тип документа»?
Martijn 12.12.2008 09:59:14
Есть ли у вас функциональность, которая работает с любым типом документа, например, Print (obAnyTypeOfDocument), который должен работать независимо от того, является ли это формой, рабочей инструкцией, процедурой и т. Д.
Gishu 12.12.2008 10:30:14
@Gishu: да Целью объектов является печать данных
Martijn 12.12.2008 12:06:16

Ответ старой школы будет создание класса с общими полями и наследовать.

Модный ответ - создать класс, в котором есть эти друзья, и иметь его в качестве члена.

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

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

0
12.12.2008 10:41:38

Слишком мало информации, чтобы дать окончательный ответ

Если бы эти объекты разделяли только атрибуты данных ... Я бы использовал что-то вроде этого.

class Document
{
   List<Field> m_Fields;
   public void AddField(Field f) {... }
   public void AddFields(Field[] f) {... }
}

class DocumentFactory()
{
  public static Document GetDocument()
  {
     Document d = new Document();
     d.AddFields(GetDocumentFields());      // private helper .. returns fields 1-8
     return d; 
  }
  public static Document GetForm()
  {
     Document d = new Document();
     AddDocumentFields(d);
     d.AddField(FIELD_9);
     d.AddField(FIELD_10);
  }
  // and so on..
}

Любой код, который работает независимо от типа документа, переходит в класс Document.
Если в дополнение к этому у вас есть поведение, которое является специализированным / основанным на конкретном типе объекта, вам необходимо вырастить иерархию типов наследования (как говорит Джон ... это похоже на отношение IS-A из имен.)

0
12.12.2008 11:13:56