Java 在基类中提供实例类型检查是一种好的做法吗
我有四节课。A、 B,D是派生类,C是基类。如果给定实例是A或D,则返回true;否则,返回false。以下是我的密码:Java 在基类中提供实例类型检查是一种好的做法吗,java,c++,Java,C++,我有四节课。A、 B,D是派生类,C是基类。如果给定实例是A或D,则返回true;否则,返回false。以下是我的密码: //A.java public class A extends C{ } //B.java public class B extends C { } //D.java public class D extends C { } //C.java public class C { public boolean isSupported(C o
//A.java
public class A extends C{
}
//B.java
public class B extends C {
}
//D.java
public class D extends C {
}
//C.java
public class C {
public boolean isSupported(C object){
boolean result= false;
// Object type check
if(object instanceof A || object instanceof D){ // A, D
result=true;
}
else { // B, C
result=false;
}
return result;
}
public static void main(String args[]){
C tmp = new A();
System.out.println(tmp.isSupported());
}
}
那么,检查基类C的isSupported()中的实例/对象类型是一种好的做法吗?(对于C++,如果在不同的文件中定义了四个类,如果我这样做,我必须在文件中定义类A和D的头文件,提供C类的实现,这有点奇怪。”
我知道我可以在每个派生类中提供重写函数。但是它是一种重复的代码,特别是如果我有很多派生类的话
谁能给我一些建议吗
谢谢基类永远不需要知道任何关于类扩展它的知识。否则,在扩展基类时需要修改它。我会认为这是非常糟糕的风格(换句话说,它是气味)-不,那不是侮辱-见“”。p>
为什么需要这样做?基类永远不需要知道有关扩展它的类的任何信息。否则,在扩展基类时需要修改它。我会认为这是非常糟糕的风格(换句话说,它是气味)-不,那不是侮辱-见“”。p>
为什么需要这样做?您应该重写子类中的
isSupported
,以便A
和D
重写它以返回true
和C
定义默认行为(返回false
)而B
从C
继承默认行为而不重写
public class C {
public boolean isSupported() {
return false;
}
}
public class A extends C {
@Override
public boolean isSupported() {
return true;
}
}
public class B extends C {
// inherits isSupported from C
}
public class D extends C {
@Override
public boolean isSupported() {
return true;
}
}
您应该重写子类中的
isSupported
,以便A
和D
重写它以返回true
,C
定义默认行为(返回false
),并且B
从C
继承默认行为而不重写
public class C {
public boolean isSupported() {
return false;
}
}
public class A extends C {
@Override
public boolean isSupported() {
return true;
}
}
public class B extends C {
// inherits isSupported from C
}
public class D extends C {
@Override
public boolean isSupported() {
return true;
}
}
这散发着设计拙劣的气息。如果B不被“支持”,它就不应该是C的基类。这让人觉得设计很糟糕。如果B不被“支持”,它就不应该是C的基类。这或多或少是JDK如何处理集合类的。例如,
AbstractCollection
,通过抛出UnsupportedOperationException
来实现clear
方法。支持该方法的派生类使用所需的功能重写,不支持该方法的其他派生类从基类获取默认行为(引发异常)。但是如果我有很多派生类,这是否意味着我需要在每个派生类中定义重写函数?我个人,我总是觉得通过接口提供一个方法,然后抛出一个不受支持的操作异常,味道很难闻。@longli不,你只在应该返回true的子类中重写isSupported
。这或多或少是JDK处理集合类的方式。例如,AbstractCollection
,通过抛出UnsupportedOperationException
来实现clear
方法。支持该方法的派生类使用所需的功能重写,不支持该方法的其他派生类从基类获取默认行为(引发异常)。但是如果我有很多派生类,这是否意味着我需要在每个派生类中定义重写函数?我个人,我总是觉得通过接口提供方法,但随后抛出一个不支持的操作异常,味道非常难闻。@longli不,您只在应该返回true的子类中重写isSupported
。