不同类别的同名调用方法

时间:2019-03-26 13:01:13

标签: java generic-programming

我有一些类具有相同名称的方法。例如

//At the end of ConfigureServices()
services.AddScoped<WindowsPrincipalToClaimPrincipal>();

//Inside Configure(), before app.UseMvc(...);
app.UseAuthentication();
app.UseSession();
app.UseMiddleware<WindowsPrincipalToClaimPrincipal>(); //moving this line to the beginning of Configure() doesn't change anything.

然后,我需要一个像这样的方法:

public class People {
    private Long id;
    private String nm;
    private String nmBn;
    .............
    public Long getId() {
        return id;
    }

    public String getNm() {
        return nm;
    }

    public String getNmBn() {
        return nmBn;
    }
}

public class Company {
    private Long id;
    private String nm;
    private String nmBn;
    .............
    public Long getId() {
        return id;
    }

    public String getNm() {
        return nm;
    }

    public String getNmBn() {
        return nmBn;
    }
}

因此,这些方法执行相同的操作,但对象类型不同。

有什么方法可以用一种方法做到这一点吗?

请注意,我无法在public String getPeopleString(People people) { if (people == null) { return ""; } return people.getNmBn() + "|" + people.getNm() + "#" + people.getId(); } public String getCompanyString(Company company) { if (company == null) { return ""; } return company.getNmBn() + "|" + company.getNm() + "#" + company.getId(); } 类或People类上进行任何更改。

2 个答案:

答案 0 :(得分:4)

如果这些类未实现公共接口或扩展公共基类(即,除了名称和签名之外的两组方法之间没有关系),则实现此目的的唯一方法是通过反射。 >

String getString(Object companyOrPeople) throws InvocationTargetException, IllegalAccessException
{
    if (companyOrPeople == null) {
        return "";
    }
    final Method getNmBn = companyOrPeople.getClass().getDeclaredMethod("getNmBn");
    final String nmBm = getNmBn.invoke(companyOrPeople).toString();
    // same with the other two methods
    return nmBm + "|" + nm + "#" + id;
}

但是,不建议这样做。您将失去所有这些方法确实存在的编译时保证。没有什么可以阻止某人传递一个Integer或String或其他没有这些吸气剂的类型。

最好的办法是更改现有的类型,但是如果不能,则不能。

如果您决定更改现有类型,那么在您需要时,帮自己一个忙,并更改属性名称。因为nmBn是什么?哦,当然,每个公司都有一个麻将。我真傻。

答案 1 :(得分:1)

首先,您应该使用通用方法创建一个接口,我们将其称为Identifiable

public interface Identifiable {

    Long getId();

    String getNm();

    String getNmBn();
}

理想情况下,您可以使PeopleCompany都实现此接口,但是正如您所说的,您不能修改现有的CompanyPeople类,因此, d然后需要扩展它们,并使子类实现Identifiable接口:

public PeopleExtended extends People implements Identifiable { }

public CompanyExtended extends Company implements Identifiable { }

现在,只需将getCompanyStringgetPeopleString方法更改为:

public String getIdString(Identifiable id) {
    return id == null ?
           "" :
           id.getNmBn() + "|" + id.getNm() + "#" + id.getId();
}

显然,可以使用PeopleExtendedCompanyExtended子类。