java超类 子类,从超类的任何子类继承(Java)

我是C程序员,在C中我可以这样做:

class SuperSuper

{

virtual void newItem()=0;

}

class SubSuperA:public SuperSuper

{

virtual void newItem()

{

//do something

}

}

class SubSuperB:public SuperSuper

{

virtual void newItem()

{

//do something different (disappear! :)

}

}

template

class SubSub:public T

{

virtual void newItem()

{

T::newItem();

//do a third thing

}

}

我想用Java做到这一点,但我感觉它(至少直接)是不可能的

我在Java中轻松设置了前三个类,如下所示:

public abstract class SuperSuper

{

abstract void newItem(Item item);

}

public class SubSuperA extends SuperSuper

{

@Override void newItem(Item item)

{

//stuff

}

}

public class SubSuperB extends SuperSuper

{

@Override void newItem(Item item)

{

//other stuff

}

}

//SubSuperC,D,etc

目前我正在实施第四个:

SubSuperA sa=new SubSuperA() {

@Override public void newItem(Item item)

{

super.newItem(item);

//A lot of stuff that will be changing constantly throughout development

}

};

SubSuperB sb=new SubSuperB() {

@Override public void newItem(Item item)

{

super.newItem(item);

//A lot of stuff that will be changing constantly throughout development

}

};

请注意,两个覆盖都具有相同的功能.无论它基于什么SubSuper *,替换newItem()都是相同的.显然这将是一个维持的噩梦.我希望我能像这样声明一个SubSub类

public class SubSub extends T {

@Override public void newItem(Item item)

{

super.newItem(item);

//A lot of stuff that will be changing constantly throughout development

}

}

我可以像这样实例化

SubSub ss=new SubSub

等…但是java中的这个错误:

"Cannot refer to the type parameter T as a supertype."

我根据该错误环顾四周,发现Extend from Generic Supertype?声称使用该方法无法实现我想做的事情.

我真正需要做的是:我有一个平台无关的Twitter客户端,只处理接收推文,存储它们等.它有一个抽象的列类(SuperSuper),我可以扩展为各种不同类型的列(SubSuper)(家庭时间轴,提及,等等,每个过滤掉他们想要在newItem()中显示的推文.我希望能够为不同的平台插入各种GUI,我需要客户端调用GUI特定的功能(SubSub)来处理将每个推文添加到GUI库.拥有可以扩展任何Column派生类的GUI特定类将是理想的解决方案

由于显然这种直接实现在Java中是不可能的,我想知道是否有一些语法技巧会实现相当类似的东西,或者我是否应该创建一个将由SuperSuper和SuperSub *存储和调用的接口由我的GUI处理程序而不是SubSub实现.

解决方法:

使用Java的泛型可以使用模板.但是,在Java中,接口比继承更受欢迎.这是因为Java不支持多重继承.

在C中,您可以扩展多个类.

class X : public A, public B, private C { }

因为C不区分虚拟和非虚拟类,只有虚拟和非虚拟成员,所以在可能有也可能没有虚拟方法的类之间没有正式的区别.

另一方面,Java有三种不同的类类型:

>混凝土(完全非虚拟,所有方法都具体)

>摘要(部分虚拟,部分非虚拟)

>界面(完全虚拟,没有具体方法)

在Java中,虚方法被称为抽象方法,因此我将在此处将其称为.

Java也有泛型.泛型在语法上与模板类似,但在实现方面完全不同.我将把实施研究留给您(在您的搜索中使用的关键字是“擦除”).

在课堂上宣布泛型.例如,Java等效于C向量的是ArrayList类.它的用途非常相似:

List strs = new ArrayList();

这里,List是一种超类型的ArrayList. List是一个接口,ArrayList实现它. List本身在其声明中声明了一个泛型类型,如下所示:

public interface List ... {

// ...

E get(int index);

// ...

}

注意get如何返回E.这里,E没有具体定义.它是一个泛型类型,在这种情况下,任何东西都可以用在它的位置,String,Object,Boolean,你自己的类等.

ArrayList实现List,并且还声明了泛型类型:

public ArrayList implements List, ... {

// ...

public E get(int index) {

// bounds check

return elements[i];

}

// ...

}

您还可以使用类型边界限制泛型的类型.这有点超出了这个范围,因为你想要的并不是真正的泛型.你想要接口.

在您的示例中,您将首先使用newItem声明一个接口.

public interface A {

void newItem();

}

每个方法都必须来自具体的实现或接口,因此需要这个接口.具体来说,这个界面相当于SuperSuper.它是一个完全虚拟的类(接口).现在为您的课程:

public class B implements A {

@Override

public void newItem() {

// Do something

}

}

public class C implements A {

@Override

public void newItem() {

// Do something else

}

}

对于像我这样没有太多C经验的人来说,你的最后一点有点令人困惑,但我假设你要说的是你想用newItem方法创建一个模板类型.在Java中,这将是A接口的另一个实现,或者您可以扩展B或C并覆盖它们的方法.

public class D extends B {

@Override

public void newItem() {

// And yet another something else

}

}

然后使用newItem方法的东西就像这样简单:

A a = new B(); // or "new C()" or "new D()"

a.newItem();

就像你怎么说

SuperSuper* a = new SubSuperA();

在Java中,您可以使用接口,抽象类和具体类来执行相同的操作,就像我上面所做的那样.

所以我认为接口是解决问题的方法.我强烈建议您阅读Java中如何使用接口.它们提供强大的类型,没有多重继承.我会很快找到几个链接.

希望那些帮助.如果您需要任何澄清,请告诉我.

标签:java,inheritance,multiple-inheritance,generics

来源: https://codeday.me/bug/20190630/1331641.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值