【问题标题】:how can i not implement all methods of an abstract class to another one that inherits it我怎么能不将抽象类的所有方法都实现到另一个继承它的方法
【发布时间】:2018-04-19 22:50:25
【问题描述】:

我是 Java 新手,我不明白我怎么能不实现抽象类 A 到类 C 的所有方法。在我的示例中,我不想在类 C 中实现方法 1。感谢您的帮助!

public abstract Class A
{
   public abstract boolean method1(Sting _str);
   public abstract void method2();
   public abstract A getA(Sring str);
}

public abstract class B extends A
{
   \\ ..
}

public class C extends B
{
  public void method2()
  {  
      \\...
  }
  public A getA(String _str)
  {
        ....
  }

  //here I don't want to implement method 1
}

public Class D extends B
{
   public boolean method1(String _str)
   {
      //...
   }
   public void method2(String _str)
   {
      //...
   }
   public A getA()
   { 
        //... 
   }
 }

【问题讨论】:

  • 将 C 类声明为 abstract
  • 具体类不能有未实现的抽象方法。
  • 或者给出A类中method1()的一般实现
  • 有些人使用UnsupportedMethodException 作为不需要的方法的基本实现。但如果你能阻止这种情况,那就去做吧。

标签: java abstract-class abstract


【解决方案1】:

抽象方法必须在类层次结构中的某处实现。

在您的示例中,您必须在 B 或 C 中实现它。没有办法绕过它。

【讨论】:

  • 我已经在 B 类中实现了它,但我仍然有同样的问题
  • 请输入密码。如果它在 B 中不是抽象的,那应该不是问题。像这个公共抽象类 B 扩展 A { public boolean method1(String _str){return false;} }
【解决方案2】:

实现它并在其中抛出 UnsupportedOperationException :

public boolean method1(String _str){
  throw new UnsupportedOperationException("message...");
}

【讨论】:

    【解决方案3】:

    使用abstract关键字需要注意的几点

    • 当一个类包含一个或多个抽象方法时,类也应声明为抽象

    • 使用抽象类时,您无法创建抽象类的对象,因为它没有完全定义

    • 抽象类的任何子类必须要么实现超类中的所有抽象方法,要么本身就是抽象的

    • 您不能创建抽象构造函数或抽象静态方法

    【讨论】:

      【解决方案4】:

      已经给出了许多答案,其中大多数确实是正确的。但是,我可以预见到这个问题更多的是关于基础知识而不是代码问题。

      首先,你需要明白这一点:

      • 从超类继承会使您的代码“紧密耦合”,因此毫无疑问需要哪些抽象方法,否则您最终会陷入混乱!

      • 从抽象超类继承的子具体类必须实现所有抽象方法!否则它必须是一个抽象类。

      • 如果需要默认行为,则需要在接口上使用抽象类。

      意味着您必须提前计划!好吧,这并不意味着您不能拥有更轻松的类设计,例如您的代码不会受到继承等机制的影响。

      您可以通过使用接口和/或组合来提供相同的结果。如果你需要比你想象的更多地改变你的设计,那就让它成为一个界面。但是,正如我之前所说,您可能有提供一些默认行为的抽象类...

      抽象类可以有具体方法,而接口不能!

      您需要了解的另一件事是,您只能从类继承,但是您可以实现任意数量的接口!这显然是一条通往我的道路……许多程序员将 Java 称为一种糟糕的编程语言,但其中许多程序员需要了解 Java 与继承无关!所以我的建议是停止使用基于抽象/具体类的继承作为一种义务!

      最后,利用简单的技术为您的工作提供动力;例如阅读依赖注入和组合!

      下面的示例仅作为实现基于抽象类的继承的正确方法。

      我希望它可以帮助您了解基础知识...玩得开心编程!

      基于抽象类的代码示例:

      public abstract class AShape {
      
          public abstract double calculateArea();
      
          public abstract double calculatePerimeter();
      
      }
      
      public class Circle extends AShape {
      
          private double radius;
      
          Circle(double radius){
              this.radius = radius;
          }
      
          @Override
          public double calculateArea() {
              return Math.PI * Math.pow(this.radius, 2);
          }
      
          @Override
          public double calculatePerimeter() {
              return Math.PI * (this.radius * 2);
          }
      
          //you can add more concrete methods here if you need
      
      }
      
      
      public class Rectangle extends AShape {
      
          private double side;
      
          Rectangle(double side){
              this.side = side;
          }
      
          @Override
          public double calculatePerimeter() {
              return 4*this.side;
          }
      
          @Override
          public double calculateArea() {
              return Math.pow(this.side, this.side);
          }
      
      }
      

      //主类

      public class Main {
      
          public static void main(String[] args) {
      
              Rectangle box = new Rectangle(2);
              System.out.printf("Box area is: %.2f\n", box.calculateArea());
              System.out.printf("Box perimeter is: %.2f\n", box.calculatePerimeter());
      
              Circle disc = new Circle(2);
              System.out.printf("Disc area is: %.2f\n", disc.calculateArea());
              System.out.printf("Disc perimeter is: %.2f\n",disc.calculatePerimeter());
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2014-02-17
        • 2013-08-25
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 2013-06-12
        • 1970-01-01
        相关资源
        最近更新 更多