什么是脆弱的基类问题?

时间:2010-05-27 13:13:29

标签: java oop

java中脆弱的基类问题是什么?

4 个答案:

答案 0 :(得分:22)

脆弱的基类是继承的常见问题,它适用于Java和支持继承的任何其他语言。

简而言之,基类是您继承的类,它通常被称为脆弱类,因为对此类的更改可能会在从其继承的类中产生意外结果。

减轻这种情况的方法很少;但是在使用继承时没有直接的方法可以完全避免它。您可以通过在Java中将类声明标记为final来阻止从类继承的其他类。

避免最严重问题的最佳做法是将所有类标记为final,除非您特意打算从它们继承。对于那些打算继承的人来说,就像设计一个API一样设计它们:隐藏所有的实现细节;严格对待你所发出的事情并注意你所接受的内容,并详细记录该课程的预期行为。

答案 1 :(得分:11)

当对其进行的更改破坏派生类时,基类称为fragile。

class Base{
    protected int x;
    protected void m(){
       x++;
    }

    protected void n(){
      x++;      // <- defect 
      m();
     }
 }


class Sub extends Base{
        protected void m(){
            n();
        }
    }

答案 2 :(得分:1)

下面在JavaWorld上的Allen Holub文章中对此进行了广泛的描述

Why extends is evil. Improve your code by replacing concrete base classes with interfaces

答案 3 :(得分:-1)

所有“Colin Pickard”所说的都是真的,在这里我想添加一些最佳实践,以便在编写可能导致Java语言出现此类问题的代码时更加受到保护,特别是如果你是创建框架或库...

  1. 默认情况下,将所有具体类设为final,因为您可能不希望它们被继承 您发现这种行为与Kotlin语言一样具有多种语言(如果您需要扩展它,那么可以删除最终关键字,因此它可以帮助您的代码的读者)。
  2. 对于抽象类,使其所有已实现的方法最终不被其子类修改(即使受保护的方法通常也是一个坏主意,subClasses应该不太了解它的子类)如果它们是不应该被覆盖......
  3. 尽量不要使用relationShip [is a]而是尝试使用类图表之间的[使用]关系来避免扩展问题..
  4. 请记住,每个扩展都可以用implements替换,如果你必须在这里创建一个默认的实现,那么就是一个代码spinet:
  5. public interface MyBehavior {
        void doAction();
    
        static class Implementation implements MyBehavior {
            public void doAction() {
                //do some stuff
            }
        }
    }
    
    //  instead of doing extends To a class that have the doAction method
    //  we will make a [use a] relationShip between the Example class & the Implementation class
    public class Example {
        private MyBehavior.Implementation helper = new MyBehavior.Implementation();
    
        public void doAction() {
            this.helper.doAction();
        }
    }