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年的版本中
您可以实现多个接口,但不能从多个类继承。我想到的第一个想法是:
不,不能对类执行此操作。然而,接口将使您朝着这个方向前进 另一方面,您可能希望添加另一个间接级别,并将经理和教练角色与人员分开,以便可以将每个角色分配给一个人(也可能是同一个人)。正如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)创建作为人员属性的新角色/能力/责任对象。第二个似乎更接近现实,所以我选择了那个。