java 将不同的参数类型传递给共享函数的一个函数

q5iwbnjs  于 2023-02-18  发布在  Java
关注(0)|答案(3)|浏览(130)

所以我有两个完全不同的对象,除了它们有一些共同的字段,我试图通过使用一个函数来减少代码,这个函数只引用这些共同的字段。
例如,有一个类称为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;
}

这样的话,如果我在将来添加另一个类,它仍然可以共享公共字段。我的第一个想法是为第二个函数使用泛型,但这对我来说是不确定的。

j0pj023g

j0pj023g1#

听起来你需要一个Interface,它是一种Java抽象类,你可以创建一个包含你的共享方法的接口,例如Sport接口如下:

interface Sport {
    public String getPlayer();
    public String getCoach();
    
}

然后你的具体类将必须实现接口,这将迫使它们都拥有接口中的方法:

class Soccer implements Sport
{

    String player = "Soccer Player";
    String coach = "Soccer Coach";

    // This attribute is unique to the Soccer class
    String shoes;
    
    // These methods are required by the interface
    public String getPlayer(){
        return player;
    }
    public String getCoach(){
        return coach;
    }
}

class Lacrosse implements Sport
{

    String player = "Lacrosse Player";
    String coach = "Lacrosse Coach";

    // This attribute is unique to the Lacrosse class
    String Rules;
    
    // These methods are required by the interface
    public String getPlayer(){
        return player;
    }
    public String getCoach(){
        return coach;
    }
}

然后,您可以使用Sport接口来保证具体类将具有共享方法。

public Map<String, String> getCommon(Map<S, S> map, Sport o){
    map.put("coach", o.getCoach());
    map.put("player", o.getPlayer());
    etc...
    return map;
}

现在可以使用Soccer对象或Lacrosse对象调用getCommon方法。

// assuming the maps already exist
    Soccer soc = new Soccer();
    Lacrosse lac = new Lacrosse();
    getCommon(socMap, soc);
    getCommon(lacMap, lac);
fcwjkofz

fcwjkofz2#

我将创建一个名为“TeamSport”的超类,包含参数:球员、球队、教练和时间。在这个类中,你将创建一个添加到所有领域的Map的方法。

kpbwa7wx

kpbwa7wx3#

泛型不是一条可行之路。你需要两个或更多的类(Soccer和Lacrosse)基于一个共同的祖先(Game)。这个共同的祖先可以是另一个"普通的"(在这里称为"超类"),一个抽象类(也称为"超类")或者一个接口
只有在需要时才使用普通的作为祖先(直接)示例化它。如果不(也就是说,如果你要创建Soccer和/或Lacrosse的示例,而不是Game的示例),你要使用一个抽象类或一个接口。这两者之间有几个不同之处,但更重要的是,每个(子)类只能从一个(超)类继承,这个(超)类可以是"普通"的,也可以是抽象的;但是它可以实现任意数量的接口(另一个关键区别是"经典"接口只是不包含代码的蓝图;但这项限制最近已放宽。)
在此示例代码中,我选择使用 * abstract类 * 作为祖先(但这 * 可能 * 不是您实际问题的最佳选择)。我还选择将getCommon()函数放在祖先中(但它可以是一个"独立"的功能)。我使用了一个Map来存储每个"游戏"的数据,以及一个包含所有Map的列表(但这与您的核心问题无关)。

import java.util.*;
import java.time.*;

abstract class Game {
  String coach;
  String player;
  
  String getCoach() { return coach; }
  String getPlayer() { return player; }
  
  Map<String, String> getCommon () {
    var map = new HashMap<String, String> ();
    
    map.put("coach", getCoach());
    map.put("player", getPlayer());
    
    return map;
  }
}

class Soccer extends Game
{
  Soccer (String league, String team, String coach, String player) { this.league = league; this.team = team; this.coach = coach; this.player = player; time = LocalTime.now(); }
  int ballCnt;
  String league;
  String team;
  String shoes;
  LocalTime time;
}

class Lacrosse extends Game
{
  Lacrosse (String team, String coach, String player) { this.team = team; this.coach = coach; this.player = player; time = LocalTime.now(); }
  String team;
  String rules[];
  LocalTime time;
}

void main(String[] args) {
  Soccer soccers[] = {
    new Soccer("League 1", "Team 1", "John Smith", "Mike"),
    new Soccer("League 1", "Team 1", "John Smith", "Peter"),
    new Soccer("League 1", "Team 2", "Alan Jones", "Charly")
  };
  
  Lacrosse lacrossers[] = {
    new Lacrosse("We play alone!", "We don't need one!", "Mary"),  
    new Lacrosse("We play alone!", "We don't need one!", "Susan")
  };
  
  // Create a List<>. Each element will be the Map<> of a soccer, lacrosser, etc 
  var list = new ArrayList<Map<String, String>> ();
  
  // Create a map for each "soccer" and add it to the common list
  for (var s : soccers)  
    list.add (s.getCommon());
  
  // Create a map for each "lacrosser" and add it to the common list
  for (var l : lacrossers)  
    list.add (l.getCommon());
  
  // Dump the list
  for (var element : list) {
    for (var entry : element.entrySet())
      System.out.println (entry.getKey() + ": " + entry.getValue());
    System.out.println ();
  }
}

输出为:
教练:约翰·史密斯
玩家:迈克
教练:约翰·史密斯
玩家:彼得
教练:阿兰·琼斯
播放器:Charly
教练:我们不需要!
扮演者:玛丽
教练:我们不需要!
扮演者:苏珊

相关问题