我如何从两个不同的抽象类中实现特定的方法?

Roh*_*rya 5 java oop inheritance interface java-8

我想从中访问所有方法(非抽象+抽象)Class A.

所以我扩展了Class A,但在这里,Class B我想访问所有非抽象方法,只有10个抽象方法 - 因为我不想实现其余的抽象方法class B.

问题:

我不能延长,Class B因为我已经延长了Class A.

2.我不能将这10个方法放在接口中,因为我也想从中访问非抽象方法class B.

什么应该是重用这些方法的正确方法?

A级

abstract class A{
public void m1(){
    //do stuff
}
public void m2(){
    //do stuff 
}
// +30 more non abstract methods

public abstract void n1();
public abstract void n2();
// +30 more abstract method 
}
Run Code Online (Sandbox Code Playgroud)

B级

abstract class B{
public void a1(){
    //do stuff
}
public void a2(){
    //do stuff 
}
// +30 more non abstract methods

public abstract void b1();
public abstract void b2();
// +30 more abstract method 
 }
Run Code Online (Sandbox Code Playgroud)

C级

class C extends A{
public  void n1(){
    //do stuff
}
public  void n2(){
    //do stuff
}
//+30 more abstract methods implemented

//But here i want all the non abstract methods and only 10 abstract methods of B
}
Run Code Online (Sandbox Code Playgroud)

Gho*_*ica 12

严肃的不回答:停止; 现在退后一步 忘了这样做.

您的设计已经处于非常糟糕的状态,这可能性非常高.因为你应该总是喜欢简单类的复杂网络而不是复杂类的简单网络.

继承多少不仅仅是写下更多A extends B.它始于:在这种情况下,任何A -a B.单独你在问题中提到的方法数量表明你的类不遵循这个简单的规则; 也许他们也在违反他人.

因此:不要浪费你的时间来理解如何在你班级的其他30种方法中添加另外10 种方法.花些时间扔掉一切; 并构建一个真正的 OO模型.

您首先要了解问题域; 从中派生出有意义的,有用的课程.专注于要解决的问题的类.遵循SOLID规则的类.或者记住好的旧FCoI范例.

长话短说:我认为一个有10多种方法的课程需要进行重构; 但有30种抽象方法; 听起来(对不起)(几乎)彻头彻尾的疯狂.

编辑,在一些评论:当然,OP有可能实际上是一个合理的设计; 因为有很多类的例子都带有很多方法(例如,考虑一个典型的Swing UI组件).但是(imho)在处理大量抽象方法时,"糟糕"设计的可能性非常高.

  • @FedericoPeraltaSchaffner为Java 1.2编写的所有东西都可以使用一些重构. (3认同)
  • @Federico Peralta Schaffner:`ArrayList`继承自`AbstractList`,它只强制实现*two*`abstract`方法,并覆盖三个额外的方法来支持可变性."ArrayList"的所有其他方法都不是必需的,但是为了提高性能而被覆盖,因此只要开发费用太高,作者就可以停止.你可以删除它们而不会破坏任何东西 这与OP的情况完全不同,在这种情况下,从一开始就认为实施三十种方法过于昂贵(但无论出于何种原因,都需要). (3认同)