Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建具有其他两个对象的所有属性的对象?_C#_Inheritance_Multiple Inheritance - Fatal编程技术网

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

C# 创建具有其他两个对象的所有属性的对象?,c#,inheritance,multiple-inheritance,C#,Inheritance,Multiple Inheritance,考虑一个体育俱乐部的情况。 一个俱乐部可以有一名俱乐部经理和一名或多名教练(每队一名教练) 下面是一个经理和教练类的例子 Class ClubManager { public void RegisterMember() { // code for registering a member.. } } Class Coach { public void DeviceTeamFormation() { // code for

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

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

Class Coach
{
    public void DeviceTeamFormation()
    {
        // code for making a team formation..
    }
}
我的问题是,我怎么能有一个同时也是教练的俱乐部经理?因为有这样的体育俱乐部

感谢所有的帮助。
谢谢各位。

多重继承正是你们想要的。不幸的是,这在C#中目前不受支持。我也没有看到它出现在2010年的版本中


您可以实现多个接口,但不能从多个类继承。

我想到的第一个想法是:

  • 创建一个ClubManagerCoach类,或者类似的,对经理和教练都有逻辑的类
  • 为IClubManager和ICoach创建接口。使用这些接口代替ClubManager和Coach
  • 让ClubManagerCoach实施IClubManager和ICoach

  • 不,不能对类执行此操作。然而,接口将使您朝着这个方向前进

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

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

    public interface ICoach {
    }
    
    public class ClubManager : SomeType, ICoach {
    }
    

    我认为在这种情况下(当然,这是一个有争议的话题),最好的折衷办法是创建一个
    ClubManagerCoach
    类,该类公开
    ClubManager
    Coach
    属性。

    我会使用委托而不是继承,而是使用复合模式。()

    您可以这样做,但是使用以下过程,因为C#不支持通过类进行继承

    Interface IClubManager 
    {
      public void RegisterMember();        
    }
    
    Interface ICoach 
    {
       // code for making a team formation.. 
    }
    class SomeDesignation : ICoach, IClubManager 
    {
    }
    

    正如其他人所指出的,虽然可以通过接口实现,但不能通过类实现,这有一个缺点,即每次都要重新实现接口。解决这个问题的一种方法是使用mixin:。

    你不能完全得到你想要的-多重继承在C#中不受支持

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

    如果将数据结构(类)分开,以便Coach类和ClubManager类具有property Person,则不会“复制”Person的数据。您可以使用工厂方法创建Coach of person和/或ClubManager of person

    另一种选择是使用“InRole”功能,该功能说明一个人可以扮演什么角色,person类将同时具有您所需的两种方法,但如果该人不是执行操作的正确角色,则其中每种方法都可能引发异常


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

    作为教练和俱乐部管理者不是此人的固有属性。他们是这个人所扮演的角色。因此,我认为应该为person对象(或您想称之为person的任何对象)分配角色。然后,这些角色/能力对象将委托这些方法

    所以它可能看起来像这样:

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

    如果没有关于你的问题的更多信息,你很难知道什么是正确的,但也许这会让你沿着不同的思路思考。

    卢塞罗的第二段是正确的方法。教练和经理不是那种人,他们是人们扮演的角色。理论上,同一个人可以是团队成员、队长、教练、经理和水上男孩

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

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

    您似乎想要多重继承,这在C#中是不受支持的。它不可能被添加到C#中,因为它会造成所有的陷阱+1这是正确的解决方案;教练和经理是人们扮演的角色,而不是各种各样的人。下面是更多细节。你的建议很有逻辑,但我对角色的概念和技巧非常陌生,也就是说,我一生中从未使用过。你能给我一些建议,让我从哪里开始理解如何使用这种技术来解决问题?谢谢你,泰。是的。。。这有点像我从屁股里拔出来的东西。基本上,我在想Ruby和合成的混合,就像Robert Davis在这里提到的那样。角色/能力似乎是一个很好的方式来解决你的问题,并假装我们的方式混合。基本上,我的想法是,你系统中的人不是“教练”。他们有时有辅导责任(也就是说,他们将来可能不是教练,那么你必须创建一个全新的对象)。从这一点看来,这些人有某种属性使他们成为教练似乎是合乎逻辑的。。。因此,我们有两个选择:1)创建包含Steven a.Lowe提到的人员的新对象,或2)创建作为人员属性的新角色/能力/责任对象。第二个似乎更接近现实,所以我选择了那个。