2010-02-16 1 views
7

Рассмотрите ситуацию в спортивном клубе. Клуб может иметь менеджера клуба и 1 или более тренеров (1 тренера за команду) Итак, вот пример классов менеджера и тренера.Создание объекта, который обладает всеми свойствами двух других объектов?

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

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

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

Цените любую помощь. Спасибо, ребята.

+2

Вам, похоже, требуется множественное наследование, которое не поддерживается в C#. –

ответ

1

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

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

+6

Это не то, что когда-либо будет добавлено к C# из-за всех создаваемых ими ошибок. http://en.wikipedia.org/wiki/Multiple_inheritance#Criticisms –

0

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

  1. Создать класс ClubManagerCoach, или что-то к тому эффекту, который имеет логику для менеджеров и тренеров.
  2. Создание интерфейсов для IClubManager и ICoach. Используйте эти интерфейсы вместо ClubManager и Coach.
  3. Сделать ClubManagerCoach реализовать IClubManager и ICoach.
8

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

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

+3

+1 Это правильное решение; Тренер и менеджер - это РОЛИ, которые играют люди, а не люди. Подробнее см. Ниже. –

1

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

public interface ICoach { 
} 

public class ClubManager : SomeType, ICoach { 
} 
0

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

1

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

Interface IClubManager 
{ 
    public void RegisterMember();   
} 

Interface ICoach 
{ 
    // code for making a team formation.. 
} 
class SomeDesignation : ICoach, IClubManager 
{ 
} 
1

Как уже отмечалось, вы не можете сделать это с помощью классов, хотя вы можете сделать это с интерфейсы, которые имеют тот недостаток, что вы каждый раз обновляете интерфейс. Один из способов - это смешивание: Is it possible to implement mixins in C#?.

1

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

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

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

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

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

2

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

Так может выглядеть следующим образом:

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

joe.getManagerAbilities().RegisterMember(); 

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

+0

Ваше предложение имеет логический смысл, но я очень новичок в этой концепции ролей и этой техники, то есть я никогда не использовал ее в своей жизни. Можете ли вы дать мне несколько предложений относительно того, с чего начать, чтобы понять, как использовать эту технику для решения проблемы? – fred

+0

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

+0

продолжение ... Итак, оттуда у нас есть несколько вариантов: 1) создать новые объекты, которые содержат человека, такого как Стивен А. Лоу, или 2) создать новые роли/способности/ответственности, которые являются атрибутами человека. Второй, казалось, подражал реальности немного ближе, поэтому я пошел с этим. –

3

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

Так что вы хотите, это композиция, а не наследование. Например:

SportsClub myClub = new SportsClub(); 
Person Bill = new Person(); 
myClub.Manager = new Manager(Bill); 
myClub.Coach = new Coach(Bill);