Использование одной базовой формы для разных классов сущностей - PullRequest
2 голосов
/ 11 апреля 2011

В настоящее время я работаю над проектом C #, где основная базовая форма получена из нескольких других форм.Я использую класс сущностей для обработки данных для каждой сущности, представленной в системе: предметов, складов, счетов и т. Д. Это означает, что каждая из этих производных форм использует свой собственный тип DAO.

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

У меня есть что-то вроде этого:

        int id;
        int.TryParse(key.Text, out id);

        instance1 = adapter1.Populate(id);

        if (instance != null)
        {
            bindingSource.DataSource = instance1;
            this.GoEdit();
            this.MarkDeleted();
        }

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

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

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Возможно, вы захотите использовать интерфейс . Это позволит вам реализовать классы, которые наследуются от этого интерфейса, но реализуют свои собственные функции для функции Populate.

Скажем, у вас есть структура классов ниже:

interface iPopulate
{
   void Populate(int id);
}

class MyBaseClass
{
  //whatever
}

class Warehouse : MyBaseClass, iPopulate
{
   void Populate(int id)
   {
       Console.WriteLine("Populate Warehouse");
   }
}

class Items : MyBaseClass, iPopulate
{
   void Populate(int id)
   {
      Console.WriteLine("Populate Item");
   }
}

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

List<MyBaseClass> stuff = new List<MyBaseClass>();
stuff.Add(new Warehouse());
stuff.Add(new Items());
foreach(MyBaseClass i in stuff)
{
    int someId = 123;
    iPopulate pop = i as iPopulate;
    pop.Populate(someId);
}

Это вывело бы:

Populate Warehouse
Populate Item
1 голос
/ 11 апреля 2011

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

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