创建一个具有两个其他对象的所有属性的对象?

时间:2010-02-16 19:58:47

标签: c# inheritance multiple-inheritance

考虑体育俱乐部的情况。 俱乐部可以有一名俱乐部经理和一名或多名教练(每队1名教练) 所以,这是Manager和Coach类的一个例子。

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

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

我的问题是,我怎么能有一位也是教练的俱乐部经理?因为有这种情况的体育俱乐部。

感谢所有帮助。 谢谢你们。

11 个答案:

答案 0 :(得分:8)

不,你不能用课来做这件事。然而,接口可以帮助您实现这一目标。

另一方面,您可能希望添加另一个间接级别,并将管理员和教练角色与人员分开,这样您就可以将每个角色分配给一个人(也可能是同一个人)。

答案 1 :(得分:3)

Lucero的第二段是正确的方法。教练和经理不是人,他们是人们扮演的角色。从理论上讲,同一个人可能是TeamPlayer,TeamCaptain,Coach,Manager和WaterBoy!

所以你想要的是构图,而不是继承。例如:

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

答案 2 :(得分:2)

作为教练并成为俱乐部经理并不是这个人的固有属性。他们是这个人所扮演的角色。因此,我会说人物对象(或者你想要称之为的任何对象)应该被赋予角色。然后,那些角色/能力对象将委托这些方法。

所以看起来像这样:

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

joe.getManagerAbilities().RegisterMember();

如果没有关于你的问题的更多信息,很难知道什么是正确的,但也许这会让你想到一些不同的路线。

答案 3 :(得分:1)

您正在寻找多重继承。不幸的是,C#目前不支持此功能。我没有看到它出现在2010版本中。

您可以实现多个接口,但无法从多个类继承

答案 4 :(得分:1)

正如Chinmay Kanchi所说,C#不支持多重继承;但是,您可以从类型继承并实现任意数量的接口。

public interface ICoach {
}

public class ClubManager : SomeType, ICoach {
}

答案 5 :(得分:1)

我会使用委托而不是继承,而是使用复合模式。 (http://en.wikipedia.org/wiki/Composite_pattern

答案 6 :(得分:1)

您可以执行此操作但使用以下过程,因为C#不支持通过类继承

Interface IClubManager 
{
  public void RegisterMember();        
}

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

答案 7 :(得分:1)

正如其他人已经注意到的那样,你不能用类做,尽管你可以用接口来做,这样做的缺点是你每次都重新实现接口。另一种方法是使用mixins:Is it possible to implement mixins in C#?

答案 8 :(得分:1)

你不能完全拥有你想要的东西 - C#不支持多重继承。

除了关于使用接口的其他建议(以及它们的局限性)之外,您可以重新考虑对象模型。

如果您将数据结构(类)分开,那么Coach类和ClubManager类具有属性Person,您将不会“复制”该人的数据。并且您可以使用工厂方法从人与人和/或ClubManager之外创建Coach。

另一种选择是具有“InRole”功能,该功能表示一个人可以拥有的角色,而Person类将具有您需要的两种方法,但如果该人不在,则每个方法都可能抛出异常。正确的角色来执行操作。

或者,您可以注入“角色”,并使用某种形式的间接访问特定角色的功能。

答案 9 :(得分:0)

这是第一个出现在我脑海中的想法:

  1. 创建一个ClubManagerCoach类,或类似的东西,对管理者和教练都有逻辑。
  2. 为IClubManager和ICoach创建接口。使用这些界面代替ClubManager和Coach。
  3. 让ClubManagerCoach实施IClubManager和ICoach。

答案 10 :(得分:0)

我认为在这种情况下你会得到的最好的妥协(当然这是一个有争议的话题)是在ClubManagerCoach类的行上创建一些暴露ClubManager和{ {1}}属性。