我有一个MyClass,它的属性类型为MyAttribute。该类由MySubClass继承,其属性类型为MySubAttribute。MySubAttribute是MyAttribute的子类:
class MyClass {
MyAttribute myAttribute;
MyClass(MyAttribute myAttribute) {
this.myAttribute = myAttribute;
}
MyAttribute getMyAttribute() {
return myAttribute;
}
}
class MySubClass extends MyClass {
MySubClass(MySubAttribute mySubAttribute) {
super(mySubAttribute);
}
}
class MyAttribute {
void doSomething() {
}
}
class MySubAttribute extends MyAttribute {
@Override
void doSomething() {
super.doSomething();
}
void doSomethingElse() {
}
}
现在假设我有以下代码:
mySubClass.getMyAttribute();
如何生成MySubAttribute类型的返回值?
通常的解决方案是泛型:
class MyClass<A extends MyAttribute> {
A myAttribute;
MyClass(A myAttribute) {
this.myAttribute = myAttribute;
}
A getMyAttribute() {
return myAttribute;
}
}
class MySubClass extends MyClass<MySubAttribute> {
或者,您可以让MySubClass使用更窄的返回类型覆盖getter:
@Override
MySubAttribute getMyAttribute() {
// we know the cast succeeds because we have set a MySubAttribute in the constructor
return (MySubAttribute) myAttribute;
}
通用解决方案提供了对实现类更好的编译时检查,并允许调用方通过编写MyClass来引用属性的类型,即使调用方不知道MyClass的子类型
您可以将这样的内容添加到MySubClass
:
@Override
MySubAttribute getMyAttribute() {
return new MySubAttribute();
}
您应该看看Java泛型。
此外,您不再需要定义MySubClass,除非您想向其添加额外的方法或属性。
class MyClass<T extends MyAttribute> {
T myAttribute;
MyClass(T myAttribute) {
this.myAttribute = myAttribute;
}
T getMyAttribute() {
return myAttribute;
}
}
class MyAttribute {
void doSomething() {
System.out.println("Doing something...");
}
}
class MySubAttribute extends MyAttribute {
void doSomethingElse() {
System.out.println("Doing something else...");
}
}
// You would instantiate `mySubClass` as follows
MyClass<MySubAttribute> mySubClass = new MyClass<>(new MySubAttribute());
mySubClass.getMyAttribute().doSomethingElse();
> RDF/OWL中继承的含义是什么? 是否可以用OWL/RDF构造面向对象语言类型的类-子类继承? 请考虑以下示例。是否“讲师”和“学生”的所有属性都将提供给“人”类? 如果有人提供给我一个很好的例子,这将是非常有帮助的答案。提前谢谢你。
我用Python编写了一个类,这样就可以从中继承。它的逻辑按预期工作,但我可以从名为的派生类中存在的状态访问属性。 生成以下错误: state_machine.py main.py
我试图弄清楚Java中的继承和数组,并试图让这些类一起工作。我相信我已经继承下来了,但我仍在为数组部分而挣扎。 有三个文件: 1. Person.java-基类2. Student.java-派生的Person.java3. Family.java-不太确定,我认为这是它自己的基类 人java有两个实例变量,String name和int age,以及各种各样的构造函数toString、equal
我在Hibernate中有道传承,下面是代码: 用户DAO: 我有一个域类用户和两个子类用户:Customer和Sales。我有两个dao类,分别用于客户和销售。 用户DAO: 客户道: 销售DAO: 我的问题是,当我使用CusterDap调用方法getUserByUsername()(继承自BaseDaoImpl)与销售的用户名(拥有用户名的用户是SalesRep的实例,而不是客户)时,它会抛出
我在挣扎。 当扩展一个类时,我可以很容易地向它添加一些新属性。 但是,当我扩展基类时,如果我想向基类的对象(简单对象的属性)添加新属性,该怎么办? 下面是一个带有一些代码的示例。 基类 派生类 现在,正如您可以从行内注释中看到的,这将激怒TypeScript。但这在JavaScript中工作。那么,实现这一目标的正确方法是什么呢?如果没有,问题是在我的代码模式本身吗?什么模式适合这个问题? 也许您
类继承是一个类扩展另一个类的一种方式。 因此,我们可以在现有功能之上创建新功能。 “extends” 关键字 假设我们有 class Animal: class Animal { constructor(name) { this.speed = 0; this.name = name; } run(speed) { this.speed = speed;