TheBigBearNow Ответов: 2

У меня есть вопрос об объектно-ориентированных концепциях или, может быть, SQL / наследовании


Всем привет,
У меня есть вопрос об объектно-ориентированных концепциях. Итак, у меня есть программа, в которой у меня есть класс User и класс Customer, который наследует все свойства пользователя, а затем имеет некоторые дополнительные функции, например: User has Id, Username, Password. Затем клиент наследует все это и имеет пару дополнительных, таких как Firstname и т. д.
В моей программе я могу использовать класс "пользователь" где-то, например, для создания администратора, затем я передаю объект на следующие экраны, и на моем новом экране я хочу иметь возможность создать клиента, который имеет все свойства пользователя, а затем добавить новые поля, такие как customerid, firstname и т. д.

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

Что я уже пробовал:

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

2 Ответов

Рейтинг:
20

Aydin Homay

Привет тебе,
Во-первых, давайте сделаем ваш вопрос немного более ясным и убедимся, что я правильно понял. Итак у вас есть класс под названием User и класс под названием Customer который является дочерним классом User класс.

public class User
{
   public string Id {get;set;}
   public string Username {get;set;}
   public SecureString Password {get;set;}
   //Read about SecureString in System.Security
}

public class Customer : User
{
   //This is more-less a builder pattern
   public Customer(User user)
   {
        Id = user.Id;
        Username = user.Username;
        Password = user.Password;
   }
   public string Name {get;set;}
}

var user = new User() { Id = "id", Username = "user" };
var customer = new Customer(user);


Итак, теперь, когда вы хотите создать клиента из пользователя, вам просто нужно использовать конструктор клиента и внедрить своего пользователя в объект клиента. Однако я бы предпочел, чтобы пользователь был свойством клиента, а не его дочерним классом. Это позволит разъединить эти две структуры, а также обеспечит большую гибкость и четкое понимание с точки зрения бизнеса.
Вы можете хранить клиентов в таблице с внешним ключом к таблице пользователя, потому что клиент может иметь более одного пользователя (сильно зависит от вашей бизнес-модели).
Но если по какой-либо разумной причине вам нужно было использовать наследование, то вы можете создать базовый/абстрактный класс, например Person и гоните обоих из этого класса.
Кстати, вам также может понадобиться взглянуть на диаграмму состояния сущности, которая говорит о различных статистических данных для одной и той же сущности на разных уровнях системы.

Овации,
АХ


Рейтинг:
2

OriginalGriff

Это неправильно: вы не должны пытаться установить циклические ссылки.
Зачем тебе это нужно?
У вас есть список пользователей, некоторые из которых являются клиентами, и отдельный список клиентов.
Таблица Customer ссылается на таблицу Users с помощью внешнего ключа, но не все пользователи являются клиентами, поэтому вам не нужна ссылка в обратном направлении.

Затем вы можете использовать соединение для объединения информации из двух таблиц.