所以我有两个完全不同的对象,除了它们有一些共同的字段,我试图通过使用一个函数来减少代码,这个函数只引用这些共同的字段。
例如,有一个类称为Soccer。Soccer具有以下字段:- 球员-球票-球队-教练-时间-鞋子
接下来是长曲棍球有这些领域:- 球员-球队-规则-教练-时间
我试图创建一个函数,它可以同时处理两种运动,但只引用公共字段,所以它可以用map += getCommon(map, soccer);
引用。
public Map<String, String> getCommon(Map<S, S> map, Object o){
map.put("coach", o.getCoach());
map.put("player", o.getPlayer());
etc...
return map;
}
这样的话,如果我在将来添加另一个类,它仍然可以共享公共字段。我的第一个想法是为第二个函数使用泛型,但这对我来说是不确定的。
3条答案
按热度按时间j0pj023g1#
听起来你需要一个Interface,它是一种Java抽象类,你可以创建一个包含你的共享方法的接口,例如
Sport
接口如下:然后你的具体类将必须实现接口,这将迫使它们都拥有接口中的方法:
然后,您可以使用
Sport
接口来保证具体类将具有共享方法。现在可以使用
Soccer
对象或Lacrosse
对象调用getCommon
方法。fcwjkofz2#
我将创建一个名为“TeamSport”的超类,包含参数:球员、球队、教练和时间。在这个类中,你将创建一个添加到所有领域的Map的方法。
kpbwa7wx3#
泛型不是一条可行之路。你需要两个或更多的类(Soccer和Lacrosse)基于一个共同的祖先(Game)。这个共同的祖先可以是另一个"普通的"类(在这里称为"超类"),一个抽象类(也称为"超类")或者一个接口。
只有在需要时才使用普通的类作为祖先(直接)示例化它。如果不(也就是说,如果你要创建Soccer和/或Lacrosse的示例,而不是Game的示例),你要使用一个抽象类或一个接口。这两者之间有几个不同之处,但更重要的是,每个(子)类只能从一个(超)类继承,这个(超)类可以是"普通"的,也可以是抽象的;但是它可以实现任意数量的接口(另一个关键区别是"经典"接口只是不包含代码的蓝图;但这项限制最近已放宽。)
在此示例代码中,我选择使用 * abstract类 * 作为祖先(但这 * 可能 * 不是您实际问题的最佳选择)。我还选择将
getCommon()
函数放在祖先中(但它可以是一个"独立"的功能)。我使用了一个Map来存储每个"游戏"的数据,以及一个包含所有Map的列表(但这与您的核心问题无关)。输出为:
教练:约翰·史密斯
玩家:迈克
教练:约翰·史密斯
玩家:彼得
教练:阿兰·琼斯
播放器:Charly
教练:我们不需要!
扮演者:玛丽
教练:我们不需要!
扮演者:苏珊