Создание объекта, который имеет все свойства двух других объектов?

Рассмотрите ситуацию спортивного клуба. Клуб может иметь менеджера Клуба и 1 или более тренеров (1 тренер на команду) Так, вот пример менеджера и Экономклассов.

Class ClubManager
{
    public void RegisterMember()
    {
        // code for registering a member..
    }
}

Class Coach
{
    public void DeviceTeamFormation()
    {
        // code for making a team formation..
    }
}

Моя проблема, как у меня может быть менеджер Клуба, который является также тренером? потому что существуют спортивные клубы с этой ситуацией.

Цените любого и всю справку.Спасибо, ребята.

7
задан Nick Craver 16 February 2010 в 20:02
поделиться

11 ответов

Тренер и менеджер клуба не являются неотъемлемыми атрибутами этого человека. Это роли, которые взял на себя человек. Таким образом, я бы сказал, что объекту человека (или как бы вы его ни называли) должны быть назначены роли. Эти объекты роли / способности затем делегируют эти методы.

Это может выглядеть так:

Person joe = new Person("joe");
joe.setClubManager(true);

joe.getManagerAbilities().RegisterMember();

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

2
ответ дан 6 December 2019 в 10:00
поделиться

Как заметил Чинмай Канчи, C # не поддерживает множественное наследование; однако вы можете унаследовать от типа и реализовать столько интерфейсов, сколько захотите.

public interface ICoach {
}

public class ClubManager : SomeType, ICoach {
}
1
ответ дан 6 December 2019 в 10:00
поделиться

Нет, вы не можете сделать это с классами. Однако интерфейсы ведут вас в этом направлении.

С другой стороны, вы можете добавить еще один уровень косвенности и отделить роли менеджера и коуча от людей, чтобы вы могли назначить каждую роль человеку (который также может быть одним и тем же человеком).

8
ответ дан 6 December 2019 в 10:00
поделиться

Множественное наследование - это то, что вы ищете. К сожалению, в настоящее время это не поддерживается в C #. Я не видел, чтобы это появилось в версии 2010 года.

Вы можете реализовать несколько интерфейсов , но вы не можете наследовать от нескольких классов .

1
ответ дан 6 December 2019 в 10:00
поделиться

Я бы использовал делегирование, а не наследование, и вместо этого использовал композитный паттерн. (http://en.wikipedia.org/wiki/Composite_pattern)

1
ответ дан 6 December 2019 в 10:00
поделиться

Вы не можете получить именно то, что хотите - множественное наследование не поддерживается в C #.

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

Если вы разделите структуру данных (классы), так что класс Coach и класс ClubManager имеют свойство Person, они не будут «дублировать» данные человека. И у вас могут быть фабричные методы для создания Coach из человека и / или ClubManager из человека.

Другой вариант - иметь функцию «InRole», которая указывает, какую роль может иметь человек, и класс Person будет иметь оба требуемых метода, но каждый из них может вызвать исключение, если человек не находится в правильная роль для выполнения операции.

Или вы можете ввести «роли» и использовать некоторую форму косвенного обращения для доступа к функциям конкретной роли.

1
ответ дан 6 December 2019 в 10:00
поделиться

Я думаю, что лучшим компромиссом в данном случае (и это, конечно, спорная тема) будет создание чего-то вроде класса ClubManagerCoach, который раскрывает свойства ClubManager и Coach.

0
ответ дан 6 December 2019 в 10:00
поделиться

Вот первая идея, которая пришла мне в голову:

  1. Создать класс ClubManagerCoach или что-то в этом роде, имеющее логику как для менеджеров, так и для тренеры.
  2. Создайте интерфейсы для IClubManager и ICoach. Используйте эти интерфейсы вместо ClubManager и Coach.
  3. Заставить ClubManagerCoach реализовать IClubManager и ICoach.
0
ответ дан 6 December 2019 в 10:00
поделиться

Второй абзац Лусеро - правильный подход. Коуч и менеджер - это не люди, это роли, которые играют люди. Теоретически один и тот же человек может быть TeamPlayer, TeamCaptain, Coach, Manager и WaterBoy!

Итак, вам нужна композиция, а не наследование. Например:

SportsClub myClub = new SportsClub();
Person Bill = new Person();
myClub.Manager = new Manager(Bill);
myClub.Coach = new Coach(Bill);
3
ответ дан 6 December 2019 в 10:00
поделиться

вы можете сделать это, но с помощью следующей процедуры, поскольку C # не поддерживает наследование через классы

Interface IClubManager 
{
  public void RegisterMember();        
}

Interface ICoach 
{
   // code for making a team formation.. 
}
class SomeDesignation : ICoach, IClubManager 
{
}
1
ответ дан 6 December 2019 в 10:00
поделиться

Как и другие Как уже отмечалось, вы не можете сделать это с классами, хотя вы можете сделать это с интерфейсами, что имеет тот недостаток, что вы каждый раз заново реализуете интерфейс. Один из способов решить эту проблему - использовать миксины: Можно ли реализовать миксины на C #? .

1
ответ дан 6 December 2019 в 10:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: