Здравствуйте, Crauberg, Вы писали:
C>------------------------------------ 8< ------------------------------------
C>// один и тот же человек, два сотрудника в разных конторах
C>employee1 = ...
C>employee2 = ...
C>person1 = (NaturalPerson)employee1
C>person2 = (NaturalPerson)employee2
C>if (person1 == person2) // True или false?
C>if (employee1 == employee2) // True или false?
C>// добиваем:
C>if (person1 == employee2) // True или false?
C>------------------------------------ 8< ------------------------------------
C>//а теперь контрольный:
C>if (object.Equals(person1, person2))
C>// или, в словарик с ключом типа NaturalPerson добавлен employee1
C>if (someDictionaryByPerson.ContainsKey(employee2))
C>// ------------------------------------ 8< ------------------------------------
Мне кажется, что как только вы ответите на все эти вопросы ("True или false?" и т.д.) сразу станет очевидным, мешает ли наследование <b>в вашей задаче<b>.
Другими словами, правильного решения самого по себе не существует, рассматривать нужно всегда в контексте задачи. Где-то лучше окажется наследование, где-то — агрегирование.
C>Подумал: а не переписать ли с использованием explicit operator (I)NaturalPerson, дабы не сильно ломать то, что есть, и включить в состав Employee весь Person. Т.е.:
C>public class Employee : IEmployee
{
public static exlicit operator /*I*/NaturalPerson(Employee e) { return e.Person; }
C>}
Есть ещё вариант с реализацией интерфейса:
public interface IEmployee : IPerson {}
// или
public class Employee : IEmployee, IPerson {}
Это лучше отражает связь между работником и человеком: работник это не специальный подвид человека, он просто может рассматриваться как человек.
Но повторюсь ещё раз — вне контекста задачи подобные размышления ничего не значат.