我有一个父类,它定义了链表方法(返回“this”的方法)的集合。我想定义多个子类,这些子类包含自己的链式方法,但也“重写”父方法,以便返回子类的实例而不是父类。
我不想在每个子类中重复相同的方法,这就是为什么我有一个父类,其中包含所有子类共享的方法。谢谢
class Chain {
public Chain foo(String s){
...
return this;
}
}
class ChainChild extends Chain {
//I don't want to add a "foo" method to each child class
/*
public ChildChain foo(String s){
...
return this;
}
*/
public ChainChild bar(boolean b){
...
return this;
}
}
ChainChild child = new ChainChild();
child.foo().bar(); //compile error: foo() returns a "Chain" object which does not define the bar() method.
这里有一个对OldCurmujongs方法的改进:
public class Parent<This extends Parent<This>> {
@SuppressWarnings("unchecked")
private final This THIS = (This)this;
public This foo() {
//...
return THIS;
}
public This bar() {
//...
return THIS;
}
}
public class Child extends Parent<Child> {
// you can override super with covariant return type
@Override
public Child bar() {
super.bar();
return this;
}
}
Child child =
new Child()
.foo()
.bar();
改进是只进行一次未检查的强制转换,并将其保存为常量THIS,您可以将其重新用作方法链接的返回值。
这将删除每个方法中未经检查的强制转换,并使代码更清晰。
您可以通过返回Child而不是这个(协变返回类型)来重写父方法。
我根据您的需求使用泛型编写了这个示例。
class Parent {
public <T extends Parent> T foo() {
return (T)this;
}
}
class Child extends Parent {
}
class AnotherChild extends Parent {
}
public class Test {
public static void main(String[] args) {
Parent p = new Child();
System.out.println(p);
Child c = p.foo();
System.out.println(c);
//throws ClassCastException here since Child is not AnotherChild
AnotherChild ac = p.foo();
System.out.println(ac);
}
}
父类中返回this
的方法仍将返回对子类对象的引用。您只能将其视为父类的对象(除非您强制转换它),但它实际上是其原始类型。
您可以考虑使用以下泛型:
// This seems a bit too contrived for my liking. Perhaps someone else will have a better idea.
public class Parent<T extends Parent<T>> {
T foo () {
return (T) this;
}
}
public class Child extends Parent<Child> {
public void bar () {
Child c = foo();
}
}
问题内容: 我有一个父类,它定义了链接器方法的集合(返回“ this”的方法)。我想定义多个子类,这些子类包含它们自己的链接器方法,但也“覆盖”父方法,以便返回子类的实例而不是父类。 我不想在每个子类中都重复相同的方法,这就是为什么我有一个父类包含所有子类共享的方法的原因。谢谢。 问题答案: 返回的父类中的方法仍将返回对子类对象的引用。您只能将其视为父类的对象(除非您对其进行了强制转换),但实际上
本文向大家介绍js面向对象的继承方式有哪些?相关面试题,主要包含被问及js面向对象的继承方式有哪些?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: 原型链继承 核心: 将父类的实例作为子类的原型 特点: 非常纯粹的继承关系,实例是子类的实例,也是父类的实例 父类新增原型方法/原型属性,子类都能访问到 简单,易于实现 缺点: 要想为子类新增属性和方法,不能放到构造器中 无法实现多继承 来自原
我们已经讨论了类与对象的功能部分,现在我们来看一下它的数据部分。事实上,它们只是与类和对象的名称空间 绑定 的普通变量,即这些名称只在这些类与对象的前提下有效。 有两种类型的 域 ——类的变量和对象的变量,它们根据是类还是对象 拥有 这个变量而区分。 类的变量 由一个类的所有对象(实例)共享使用。只有一个类变量的拷贝,所以当某个对象对类的变量做了改动的时候,这个改动会反映到所有其他的实例上。 对象
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过 继承 机制。继承完全可以理解成类之间的 类型和子类型 关系。 假设你想要写一个程序来记录学校之中的教师和学生情况。他们有一些共同属性,比如姓名、年龄和地址。他们也有专有的属性,比如教师的薪水、课程和假期,学生的成绩和学费。 你可以为教师和学生建立两个独立的类来处理它们,但是这样做的话,如果要增加一个新的共有属性,就意味着要
前言 类与实例: 类的声明 生成实例 类与继承: 如何实现继承:继承的本质就是原型链 继承的几种方式 类的定义、实例化 类的定义/类的声明 方式一:用构造函数模拟类(传统写法) function Animal1() { this.name = 'smyhvae'; //通过this,表明这是一个构造函数 } 方式二:用 class 声明(ES6的写法) cl
本文向大家介绍Python面向对象中的继承有什么特点相关面试题,主要包含被问及Python面向对象中的继承有什么特点时的应答技巧和注意事项,需要的朋友参考一下 补充继承的应用(面试题)