Рассмотрите ситуацию спортивного клуба. Клуб может иметь менеджера Клуба и 1 или более тренеров (1 тренер на команду) Так, вот пример менеджера и Экономклассов.
Class ClubManager
{
public void RegisterMember()
{
// code for registering a member..
}
}
Class Coach
{
public void DeviceTeamFormation()
{
// code for making a team formation..
}
}
Моя проблема, как у меня может быть менеджер Клуба, который является также тренером? потому что существуют спортивные клубы с этой ситуацией.
Цените любого и всю справку.Спасибо, ребята.
Тренер и менеджер клуба не являются неотъемлемыми атрибутами этого человека. Это роли, которые взял на себя человек. Таким образом, я бы сказал, что объекту человека (или как бы вы его ни называли) должны быть назначены роли. Эти объекты роли / способности затем делегируют эти методы.
Это может выглядеть так:
Person joe = new Person("joe");
joe.setClubManager(true);
joe.getManagerAbilities().RegisterMember();
Трудно понять, что является правильным, без дополнительной информации о вашей проблеме, но, возможно, это заставит вас задуматься в другом направлении.
Как заметил Чинмай Канчи, C # не поддерживает множественное наследование; однако вы можете унаследовать от типа и реализовать столько интерфейсов, сколько захотите.
public interface ICoach {
}
public class ClubManager : SomeType, ICoach {
}
Нет, вы не можете сделать это с классами. Однако интерфейсы ведут вас в этом направлении.
С другой стороны, вы можете добавить еще один уровень косвенности и отделить роли менеджера и коуча от людей, чтобы вы могли назначить каждую роль человеку (который также может быть одним и тем же человеком).
Множественное наследование - это то, что вы ищете. К сожалению, в настоящее время это не поддерживается в C #. Я не видел, чтобы это появилось в версии 2010 года.
Вы можете реализовать несколько интерфейсов , но вы не можете наследовать от нескольких классов .
Я бы использовал делегирование, а не наследование, и вместо этого использовал композитный паттерн. (http://en.wikipedia.org/wiki/Composite_pattern)
Вы не можете получить именно то, что хотите - множественное наследование не поддерживается в C #.
Наряду с другими предложениями об использовании интерфейсов (с их ограничениями), вы можете вообще переосмыслить объектную модель.
Если вы разделите структуру данных (классы), так что класс Coach и класс ClubManager имеют свойство Person, они не будут «дублировать» данные человека. И у вас могут быть фабричные методы для создания Coach из человека и / или ClubManager из человека.
Другой вариант - иметь функцию «InRole», которая указывает, какую роль может иметь человек, и класс Person будет иметь оба требуемых метода, но каждый из них может вызвать исключение, если человек не находится в правильная роль для выполнения операции.
Или вы можете ввести «роли» и использовать некоторую форму косвенного обращения для доступа к функциям конкретной роли.
Я думаю, что лучшим компромиссом в данном случае (и это, конечно, спорная тема) будет создание чего-то вроде класса ClubManagerCoach
, который раскрывает свойства ClubManager
и Coach
.
Вот первая идея, которая пришла мне в голову:
Второй абзац Лусеро - правильный подход. Коуч и менеджер - это не люди, это роли, которые играют люди. Теоретически один и тот же человек может быть TeamPlayer, TeamCaptain, Coach, Manager и WaterBoy!
Итак, вам нужна композиция, а не наследование. Например:
SportsClub myClub = new SportsClub();
Person Bill = new Person();
myClub.Manager = new Manager(Bill);
myClub.Coach = new Coach(Bill);
вы можете сделать это, но с помощью следующей процедуры, поскольку C # не поддерживает наследование через классы
Interface IClubManager
{
public void RegisterMember();
}
Interface ICoach
{
// code for making a team formation..
}
class SomeDesignation : ICoach, IClubManager
{
}
Как и другие Как уже отмечалось, вы не можете сделать это с классами, хотя вы можете сделать это с интерфейсами, что имеет тот недостаток, что вы каждый раз заново реализуете интерфейс. Один из способов решить эту проблему - использовать миксины: Можно ли реализовать миксины на C #? .