zoukankan      html  css  js  c++  java
  • java编程继承的第一原则

      对于【继承】的第一印象就是获得了父的所有方法和属性,所以相对于继承了父的功能和职责。而后面自己的设计也是基于这个原则,就是复用原则,复用父项的方法原则。慢慢的延伸就是有多个子类,就会把几个子类共用的一些方法放到父类里面,而这种设计思想深深的影响了自己很久。

      而这种方法却在近年来被自己慢慢的推翻,现在使用继承的第一原则就是模板,Template。通过父类使用Template模式,构造出子类的流程,而自己只是在对应的钩子方法(Hook)里面填充着差异的地方,如果不是这种情况,我会尽量的减少继承的使用。对于原来的把子类的方法推到父类的方法里面,则通过其它的方式进行消除掉了。造成这种变化,只是源于一个原则的影响,【一切私有方法都是有罪的】。

      在编码的时候,大量的把方法推到父类之后,才发现这些方法,别的地方也会需要,而这个时候,就很痛苦,因为通过继承肯定不行,但是不继承,别的地方就需要copy一份,不copy就需要把这个方法变成静态的方法,而这个时候,就会出现很奇怪的关系了。广州java培训这种问题,我一般都是把这些方法归属到几个其它类中,因为调用super.method(),和调用Other.method()实际上代码是一样的,都没有减少和增加,但是类的职责却清晰了很多。

      近些年随着IOC的增多,那么Template的使用也自然增多了很多,所以也自然的倾向于父类定义流程,子类实现差异的方式来做,而不是父类提供方法,子类进行组装。两种差异的直观比较,见下面的代码。

      第一种方式:父类提供大量方法,子类组装

      1 public class FatherMehod {

      2

      3 protected void a() {

      4 // doSomeThing

      5 }

      6

      7 protected void b() {

      8 // doSomeThing

      9 }

      10

      11 protected void c() {

      12 // doSomeThing

      13 }

      14

      15 }

      1 public class SonSetup extends FatherMehod {

      2 public void doProcess() {

      3 a();

      4 b();

      5 c();

      6 }

      7 }

      第二种方法:父类提供流程,子类实现差异(Template)

      1 public abstract class FatherTemplate {

      2 public void doProcess() {

      3 a();

      4 b();

      5 c();

      6 }

      7

      8 protected abstract void a();

      9 protected abstract void b();

      10 protected abstract void c();

      11 }

      1 public class SonDiff extends FatherTemplate{

      2

      3 protected void a() {

      4 // doSomeThing

      5 }

      6

      7 protected void b() {

      8 // doSomeThing

      9 }

      10

      11 protected void c() {

      12 // doSomeThing

      13 }

      14

      15 }

      差异就在于在第一种方式里面子类实现的代码,变成父类实现了,实现了控制反转(IOC),这个就是我的继承的第一原则,Template。

  • 相关阅读:
    git 看不到别人创建的远程分支
    win10 系统开始菜单没反应的解决方法
    Fiddler 抓取 https 设置详解(图文)
    MongoDB + Express + art-template 项目实例-博客管理系统
    使用 XAML 格式化工具:XAML Styler
    [WPF] 在单元测试中使用 Prism 的 EventAggregator,订阅到 ThreadOption.UIThread 会报错
    分别使用 Python 和 Math.Net 调用优化算法
    在 Azure 上执行一些简单的 python 工作
    Linux默认路由与直连路由
    网站使用域名访问而禁止ip访问的配置
  • 原文地址:https://www.cnblogs.com/gojava/p/3529824.html
Copyright © 2011-2022 走看看