java - 继承 : using base class or derived class to do stuff

标签 java oop inheritance design-patterns language-agnostic

<分区>

这是一个关于应该如何使用继承的简单问题。

考虑到我必须提供打印“foo”和“bar”的业务逻辑,并且我有两个类的层次结构:一个类具有仅打印“foo”的方法,另一个首先扩展并具有打印“bar”的方法'. 在这两个类中,我都有一个名为 necessaryMethod() 的方法,它负责调用打印“foo”和“bar”的那些方法。

我的实现方式有两种:

第一种方法是让基类做一些事情,派生类利用它。第二种方法是让基类不做任何事情(只提供实现)并将所有责任交给派生类。

考虑以下代码:

方法一:

public class A{

    protected void necessaryMethod(){
        callFoo();
    }

    protected void callFoo(){
        System.out.pritln("foo");
    }       
}

public class B extends A{

    @Override
    protected void necessaryMethod(){
        super.necessaryMethod();
        callBar();
    }

    protected void callBar(){
        System.out.println("bar");
    }   
}

public class FooBarClass{
    public static void main(String args[]){
        B b = new B();
        b.necessaryMethod();
    }
}

方法 2:

public abstract class A{

    protected abstract void necessaryMethod();

    protected void callFoo(){
        System.out.pritln("foo");
    }       
}

public class B extends A{

    @Override
    protected void necessaryMethod(){
        calFoo();
        callBar();
    }

    protected void callBar(){
        System.out.println("bar");
    }   
}

public class FooBarClass{
    public static void main(String args[]){
        B b = new B();
        b.necessaryMethod();
    }
}

哪种方法对代码的可维护性和可读性更好(在大型软件产品/大类层次结构的上下文中;这只是一个示例)?

(这是一个一般的编程问题,我没有征求意见。)

最佳答案

暂时抛开编程的技术方面,事物的行为方式(它的方法)有助于定义它。即狗叫 ()。

一般的问题是:

  1. callFoo() 行为是否让您想到“A”(A 类)或“B”?

1.1。在类中组织方法(行为),它们将属于编程之外的类 - 在定义类时。

大型代码库

即使在现实世界中 B 可能属于 A 的集合,但有时过多的继承会不利于导航和维护代码。继承的目的更重要,实现继承本身和不使用继承的调用可能更好。

我在一年前实现了一个大型代码库,对其背后复杂的 UML 感到非常自豪,但最近重新访问它是一场噩梦。在某些地方,我可以更加谨慎地选择是否采用继承。

这个上下文中的问题是:这种继承是否有助于组织代码?它对其他程序员有帮助吗?

抽象类

在程序中的任何时候实例化父类(super class)的实例代替其中一个子类是否有意义?如果不是,则抽象父类(super class)获得投票。

关于java - 继承 : using base class or derived class to do stuff,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33594684/

相关文章:

javascript 哎呀。构造函数与原型(prototype)设计

Django:模型继承:FK & M2M

c++ - 使用父类的变量

C++、std::list、赋值、继承

c# - 是否可以覆盖 C# 中的构造函数?

C++ 类成员和延迟初始化

java - 如何确定 JMock 模拟对象正在模拟哪个类?

java - 如何为 MongoDbMessageStore.MessageReadingMongoConverter 设置 mapKeyDotReplacement

java - 我需要对基于 Spring 的 Rest Web 服务进行验证

java - 在 Actionlistener 中使用 EventObject.getSource