继承内部类
来源:互联网 发布:阿里云自建数据库 编辑:程序博客网 时间:2024/05/17 06:44
最近刚好碰到一个场景,需要继承某个类的内部类。Thinking in Java是这样描述的:
Because theinner-class constructor must attach to a reference of the enclosing classobject,
things are slightly complicated when you inherit from an inner class. Theproblem is that the
"secret" reference to the enclosing class object must beinitialized, and yet in the derived class
there’s no longer a default object to attach to. You must use a special syntaxto make the
association explicit:
//: innerclasses/InheritInner.java
// Inheriting an inner class.
class WithInner {
class Inner {}
}
public class InheritInner extends WithInner.Inner {
//! InheritInner() {} // Won’t compile
InheritInner(WithInner wi) {
wi.super();
}
public static void main(String[] args) {
WithInner wi = new WithInner();
InheritInner ii = new InheritInner(wi);
}
} ///:~
You can see that InheritInner is extending only the innerclass, not the outer one. But when
it comes time to create a constructor, the default one is no good, and youcan’t just pass a
reference to an enclosing object. In addition, you must use the syntax
enclosingClassReference.super();
inside the constructor. This provides the necessary reference, andthe program will then
compile.
测试代码:一个内部类继承另外一个类的内部类。
MyQuery:
importjava.io.Serializable;
importjava.lang.reflect.Array;
importjava.util.ArrayList;
importjava.util.List;
public classMyQuery implements Serializable{
public List<Constraint> constraints;
public String sortOrder = "DESC";
public MyQuery(){
constraints = newArrayList<Constraint>();
}
public List<Constraint>getConstraints(){
return this.constraints;
}
public void addConstraint(Stringcolnm,String op, String value) {
Constraint c = new Constraint();
c.setColumnName(colnm);
c.setOperator(op);
c.setValue(value);
this.getConstraints().add(c);
}
public void addConstraint(Constraint con) {
constraints.add(con);
}
public class Constraint implementsSerializable {
private String columnName;
private String operator;
private String value;
final MyQuery qr;
public Constraint() {
qr= MyQuery.this;
System.out.println("*** Constraintconstructor,query.sortOrder:" + qr.sortOrder);
}
public String getColumnName()
{
return columnName;
}
public void setColumnName(StringcolumnName)
{
this.columnName = columnName;
}
public String getOperator()
{
return operator;
}
public void setOperator(Stringoperator)
{
this.operator = operator;
}
public String getValue()
{
return value;
}
public void setValue(String val)
{
this.value = val;
}
public String toString()
{
StringBuffer sb = new StringBuffer(512);
sb.append("Constraint");
sb.append("[");
sb.append("columnName=").append(columnName).append(",");
sb.append("operator=").append(operator).append(",");
sb.append("value=");
valueToString(sb, value);
sb.append(", ");
sb.append("]");
return sb.toString();
}
protected StringBuffervalueToString(StringBuffer sb, Object value)
{
if(value == null)
sb.append("null");
else
if(value.getClass().isArray())
{
int length =Array.getLength(value);
sb.append("{");
for(int i = 0; i < length;i++)
{
Object itemValue =Array.get(value, i);
if(i > 0)
sb.append(",");
sb.append(itemValue);
}
sb.append("}");
} else
{
sb.append(value);
}
return sb;
}
}
}
ExtMyQuery:
import java.util.ArrayList;
import java.util.List;
publicclass ExtMyQuery {
public List<ExtConstraint>constraints;
publicExtMyQuery(){
constraints =new ArrayList<ExtConstraint>();
}
public List<ExtConstraint> getConstraints(){
returnthis.constraints;
}
publicvoid addConstraint(MyQuery mq, String colnm, String op,String value,String coltype) {
ExtConstraint c = new ExtConstraint(mq);
c.setColumnName(colnm);
c.setOperator(op);
c.setValue(value);
c.setColType(coltype);
this.getConstraints().add(c);
}
publicvoid addConstraint(ExtConstraint con) {
constraints.add(con);
}
class ExtConstraintextends MyQuery.Constraint {
public StringcolType;
public ExtConstraint(MyQuery mq){
mq.super();
}
public String getColType() {
returncolType;
}
publicvoid setColType(String colType) {
this.colType = colType;
}
}
}
Test:
publicclassTest{
publicstaticvoid main(String[] args){
MyQuery mq = new MyQuery();
ExtMyQuery emq = new ExtMyQuery();
emq.addConstraint(mq, "taskId","Equals","23456", "Integer");
List<ExtMyQuery.ExtConstraint> cons =emq.getConstraints();
for (ExtMyQuery.ExtConstraint con : cons){
System.out.println("colname:" + con.getColumnName() +",operator:" +con.getOperator() +",value:" + con.getValue() +",coltype:" +con.getColType());
}
}
}
- 继承内部类
- java继承内部类
- java继承内部类
- Java 内部类继承
- 继承内部类
- 内部类继承
- Java 继承内部类
- java 继承 内部类
- 内部类的继承-内部类
- 内部类(多继承)
- 内部类实现多重继承
- 怎样继承一个内部类
- 内部类实现多重继承
- 内部类实现多继承~
- java内部类的继承
- 内部类——内部类的继承
- Java内部类+匿名内部类详解+内部类实现多重继承
- 从内部类继承 内部类被覆盖 内部类生成的class文件名
- Android 最火的快速开发框架AndroidAnnotations使用详解
- OC知识点
- 2013下半年软件评测师真题考试分析-2
- 缘语言 V1.0 发布!
- Java学习——传说中的13个规范
- 继承内部类
- Java遍历Set集合
- 基于NodeJS的全栈式开发(基于NodeJS的前后端分离)
- jQuery图表插件Flot中文文档
- 添加源文件、头文件编译程序,报error LNK2001: unresolved external symbol
- ios数据类型、函数面向对象
- MFC、WTL、WPF、wxWidgets、Qt、GTK 各有什么特点
- 读书笔记-深入理解JVM虚拟机-1.OOM初探
- 深入理解String、StringBuffrt、StringBuilder