Как реализовать классы, которые используют одинаковые переменные - PullRequest
0 голосов
/ 12 декабря 2008

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

Пример:

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

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

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

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

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

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

Thnx

Ответы [ 3 ]

2 голосов
/ 12 декабря 2008

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

РЕДАКТИРОВАТЬ: например, предположим, что у вас есть элемент управления пользовательского интерфейса, который может отображать общие части любого документа - то есть общие 8 полей. Это займет экземпляр документа. Вы можете хотеть иметь возможность передать ему форму или рабочую инструкцию напрямую - в этом случае лучше всего получить из документа. В качестве альтернативы, при рендеринге 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));

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

0 голосов
/ 12 декабря 2008

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

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

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 декабря 2008

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

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

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

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

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