Java 两个类具有一些公共属性,但没有继承
我有两个类,它们有一些共同的属性:Java 两个类具有一些公共属性,但没有继承,java,Java,我有两个类,它们有一些共同的属性: public class A { private String a; private String b; private String c; // setters & getters } public class B { private String a; private String b; private String c; // setters & getters } 如果没有hiretage,我想创建一个可以接受这两个类之一的泛型方法
public class A {
private String a;
private String b;
private String c;
// setters & getters
}
public class B {
private String a;
private String b;
private String c;
// setters & getters
}
如果没有hiretage,我想创建一个可以接受这两个类之一的泛型方法
public <T> void myMethod(T object){
object.getC(); // "c" attribute of class A and B
}
public void myMethod(T对象){
类A和B的object.getC();/“c”属性
}
如何在java 8中做到这一点您可以定义如下接口:
interface ISomeInterfaceToGetC {
String getC();
}
实施很简单:
class A implements ISomeInterfaceToGetC {
@Override
public String getC(){
return c;
}
}
然后,您的两个类都可以实现这个接口,而不是传递
T对象
,您可以传递ISomeInterfaceToGetC实现对象
并调用implementationObject.getC()代码>将返回字符串。您可以定义如下界面:
interface ISomeInterfaceToGetC {
String getC();
}
实施很简单:
class A implements ISomeInterfaceToGetC {
@Override
public String getC(){
return c;
}
}
然后,您的两个类都可以实现这个接口,而不是传递T对象
,您可以传递ISomeInterfaceToGetC实现对象
并调用implementationObject.getC()代码>将返回您的字符串。为什么不直接使用单独的POJO类,它将同时提供公共代码,而无需继承或实现
class Data{
private String a;
public String getA(){
return this.a;
}
/* TO DO */
}
class A {
private Data data;
/* TO DO */
}
class B {
private Data data;
/* TO DO */
}
public void myMethod(Data data){
data.getA();
}
为什么不直接使用单独的POJO类呢?它既可以提供公共代码,也不需要继承或实现
class Data{
private String a;
public String getA(){
return this.a;
}
/* TO DO */
}
class A {
private Data data;
/* TO DO */
}
class B {
private Data data;
/* TO DO */
}
public void myMethod(Data data){
data.getA();
}
我还建议您在这里使用和接口。然而,如果你真的想遵循你原来的方式。下面是一个例子
public <T> void myMethod(T object){
String val;//Common type for both Class A and B
if (object instanceof A)
val = ((A) object).getC();
else if (object instanceof B)
val = ((B) object).getC();
else
val = null; //Unsupported type
System.out.println(val);
}
public void myMethod(T对象){
String val;//A类和B类的通用类型
if(A的对象实例)
val=((A)object.getC();
else if(B的对象实例)
val=((B)object.getC();
其他的
val=null;//不支持的类型
系统输出打印项次(val);
}
我还建议您在此处使用和接口。然而,如果你真的想遵循你原来的方式。下面是一个例子
public <T> void myMethod(T object){
String val;//Common type for both Class A and B
if (object instanceof A)
val = ((A) object).getC();
else if (object instanceof B)
val = ((B) object).getC();
else
val = null; //Unsupported type
System.out.println(val);
}
public void myMethod(T对象){
String val;//A类和B类的通用类型
if(A的对象实例)
val=((A)object.getC();
else if(B的对象实例)
val=((B)object.getC();
其他的
val=null;//不支持的类型
系统输出打印项次(val);
}
如果您想要一种通用的方法来实现这一点,那么您可以按照以下步骤操作
a。首先定义一个接口
public interface Sea {
public int getC();
}
b。然后类让您的两个类实现接口
public class Eh implements Sea {
private int c = -1;
@Override
public int getC() {
return c;
}
}
public class Bee implements Sea {
private int c = -1;
@Override
public int getC() {
return c;
}
}
c。现在,您可以使用带有参数的泛型方法,该参数接受从接口Sea
实现的任何泛型对象
public class GenericClass<T extends Sea> {
public void getGenericSea(T object) {
object.getC();
}
}
公共类GenericClass{
public void getGenericSea(T对象){
getC();
}
}
如果您想要一种通用的方法来实现这一点,那么您可以按照以下步骤操作
a。首先定义一个接口
public interface Sea {
public int getC();
}
b。然后类让您的两个类实现接口
public class Eh implements Sea {
private int c = -1;
@Override
public int getC() {
return c;
}
}
public class Bee implements Sea {
private int c = -1;
@Override
public int getC() {
return c;
}
}
c。现在,您可以使用带有参数的泛型方法,该参数接受从接口Sea
实现的任何泛型对象
public class GenericClass<T extends Sea> {
public void getGenericSea(T object) {
object.getC();
}
}
公共类GenericClass{
public void getGenericSea(T对象){
getC();
}
}
您应该使用一个接口,并在其中定义getC()方法。然后可以将接口传递给该方法。为什么不希望继承?如果它们不是同一类型,或者假设它们不具有相同的超类型,这样做是没有意义的接口或继承可能是最好的方式,但如果您确实需要它们完全分开,您可以尝试提供能够从类中提取属性的函数参数(即函数
)。然后您可以像myMethod(instanceOfA,A::getC)
或myMethod(instanceOfB,B::getC)
一样使用它。但我要重申:如果你能使用一个通用接口,那么就使用它吧@mzlle然后查找java接口。不要要求定制代码,仅仅通过复制粘贴实际上不会学到任何东西。学习使用它们将使您更容易理解它,并且能够在下次自己完成它,而不仅仅是复制粘贴其他人的代码。您应该使用一个接口并在其中定义getC()方法。然后可以将接口传递给该方法。为什么不希望继承?如果它们不是同一类型,或者假设它们不具有相同的超类型,这样做是没有意义的接口或继承可能是最好的方式,但如果您确实需要它们完全分开,您可以尝试提供能够从类中提取属性的函数参数(即函数
)。然后您可以像myMethod(instanceOfA,A::getC)
或myMethod(instanceOfB,B::getC)
一样使用它。但我要重申:如果你能使用一个通用接口,那么就使用它吧@mzlle然后查找java接口。不要要求定制代码,仅仅通过复制粘贴实际上不会学到任何东西。与仅仅复制粘贴别人的代码相比,学会与他们一起工作将使你更容易理解它,并能在下次自己完成它好,谢谢你Breningood,谢谢你Brenin