I have a list of contacts, classified into categories. Each category is represented with a different class.So, base class:class Contact{    public ushort Id { get; private set; }    public Phone Phone { get; private set; }    public Contact(ushort id, Phone phone)    {        Id = id;        Phone = phone;    }}And here are the categories:PrivateServiceProvider (meaning - private person):class PrivateServiceProvider : Contact{    public string FirstName { get; private set; }    public string LastName { get; private set; }    public ServiceField ServiceField { get; private set; }    public PrivateServiceProvider(ushort id, string firstName, string lastName,                                  ServiceField serviceField, Phone phone)        : base(id, phone)    {        FirstName = firstName;        LastName = lastName;        ServiceField = serviceField;    }}BusinessServiceProvider:class BusinessServiceProvider : Contact{    public string Name { get; private set; }    public ServiceField ServiceField { get; private set; }    public Email Email { get; private set; }    public BusinessServiceProvider(ushort id, string name,                                   ServiceField serviceField, Phone phone, Email email)        : base(id, phone)    {        Name = name;        ServiceField = serviceField;        Email = email;    }}PrivateGenericContact:class PrivateGenericContact : Contact{    public string FirstName { get; private set; }    public string LastName { get; private set; }    public PrivateGenericContact(ushort id, string firstName, string lastName, Phone phone)        : base(id, phone)    {        FirstName = firstName;        LastName = lastName;    }}BusinessGenericContact:class BusinessGenericContact : Contact{    public string Name { get; private set; }    public Email Email { get; private set; }    public BusinessServiceProvider(ushort id, string name, Phone phone, Email email)        : base(id, phone)    {        Name = name;        Email = email;    }}It works, but how could I improve it 1?Also, it drives me CRAZY that the names of the classes are so lengthy. I think it's a smell but I am not sure what to do about it. If some day I decide to create another specification of Contact, lets say - for people who lives in the city versus in the country2, will I call the class CountryPrivateServiceProvider? It's NUTS.So how can I improve my code, both generally and specifically to this naming problem?EditAn example of use is when the user creates a contact. So he chooses the type of contact and inserts all of the information into a form (a View - I am using MVP). Then the View notify the Presenter that the user pressed the Save and creates an object of the selected type. Then the Presenter ask the Model to insert the information into the database.1. They are deliberately immutable.2. Apparently, I am not good with examples.
Multiple types of contacts
c#