在基类中提供检查实例类型是一种好的做法吗
Is it a good practice to provide check the instance type in the base class
我有四个类。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 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++,如果在不同的文件中定义了四个类,如果我这样做,我必须在提供类C实现的文件中包括定义类A和D的头文件,这有点奇怪)。
我知道我可以在每个派生类中提供一个重写函数。但是它是不是有点重复代码,尤其是如果我有很多派生类的话。
有人能给我一些建议吗?
感谢
您应该重写子类中的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;
}
}
基类永远不应该知道任何关于扩展它的类的信息。否则,在扩展基类时需要修改基类。我认为这种风格非常糟糕(换句话说,它"有气味"-不,这不是侮辱-请参阅"代码气味")。
你为什么要这么做?
相关文章:
- 有没有一种方法可以在编译时获得作用域类名
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 使用类在C++中存储和列出变量/方法是否是一种好的做法
- 文本冒险游戏 - 如何区分一种项目类型与另一种项目类型以及如何构建项目类/子类
- 派生类的后一种分配
- 类中一种方法的部分专用化
- 使用哪种模式来执行新代码,只需添加基类的新子类?
- 有没有一种方法可以使用SFINAE来检测一个类型是否实现了给定的抽象基类
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- 有没有一种不太直截了当的方法将基类方法引入子类?
- 有没有一种方法可以防止基类方法在派生类的实例上被调用
- 用typedeffing模板基类来简化代码是一种好的做法吗
- 在基类中提供检查实例类型是一种好的做法吗
- 将指针从一种基类型转换为另一种基型
- 在我的C++应用程序中定义IHaveVirtualDestructor基类是一种好的做法吗
- 有没有一种聪明的方法可以禁止通过派生类之一隐藏基类的运算符函数
- 有没有一种方法可以在不定义c++基类的情况下创建工厂
- 是否有一种方法来绕过必须前缀模板基类成员与' this '
- 假设没有公共代码,将公共代码移到基类中是一种好做法吗?
- 使用派生类的数据调用基类的方法:有没有一种优雅的方法可以做到这一点?