Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:继承_Java_Oop_Inheritance - Fatal编程技术网

java:继承

java:继承,java,oop,inheritance,Java,Oop,Inheritance,继承的替代方法有哪些?有效的Java:支持组合而不是继承。(这实际上也来自四人帮) 他提出的理由是,如果扩展类不是显式设计为继承的,那么继承可能会导致许多不恰当的副作用。例如,对super.someMethod()的任何调用都可能导致您通过未知代码的意外路径 相反,保留对本应扩展的类的引用,并委托给它 这里是一个链接,链接到Erich Gamma的一个网站,他在那里稍微谈到了这个概念。一些替代方案: ,亦称 我假设您正在使用Java,它有一些关于继承的规则 实现接口是一个常见且经常使用的选

继承的替代方法有哪些?

有效的Java:支持组合而不是继承。(这实际上也来自四人帮)

他提出的理由是,如果扩展类不是显式设计为继承的,那么继承可能会导致许多不恰当的副作用。例如,对
super.someMethod()
的任何调用都可能导致您通过未知代码的意外路径

相反,保留对本应扩展的类的引用,并委托给它

这里是一个链接,链接到Erich Gamma的一个网站,他在那里稍微谈到了这个概念。

一些替代方案:

  • ,亦称

我假设您正在使用Java,它有一些关于继承的规则

实现接口是一个常见且经常使用的选项。因此,例如,如果您有一个与RDBMS对话的数据源类,而不是继承该类并使用它来实现NoSQL数据源,那么两者可以实现相同的接口

而不是

public class RDBMSDataSource {

  ...

  public String loadSomeDataFromDataSource() {
    ...Do some stuff...
  }
}

public class NoSQLDataSource extends RDBMSDataSource {

   ...

   @Override
   public String loadSomeDataFromDataSource() {
      ...Do some other stuff...
   }
}

public class DataSourceClient {

   public void foo() {
      RDBMSDataSource ds = new NoSQLDataSource();
      ds.loadSomeDataFromDataSource();
   }
}
它可以工作,但很难阅读,你可以用这个

public interface DataSource {
   public String loadSomeDataFromDataSource();
}

public class RDBMSDataSource implements DataSource {

  ...

  public String loadSomeDataFromDataSource() {
    ...Do some stuff...
  }
}

public class NoSQLDataSource implements DataSource {

   ...

   @Override
   public String loadSomeDataFromDataSource() {
      ...Do some other stuff...
   }
}

public class DataSourceClient {

   public void foo() {
      DataSource ds = new NoSQLDataSource();
      ds.loadSomeDataFromDataSource();
   }
}
另一个选择是组成。假设你有员工和客户。你的两个选择是

public class Person {

   protected String name;
   protected String address;
   ...More stuff...
}

public class Employee extends Person {

   protected String jobCode;
   protected String department;
   ...More stuff...
}

public class Customer extends Person {

   protected String salesPerson;
   protected Date registrationDate;
   ...More stuff...
}
……或者

public class ContactInfo {
   private String name;
   private String address;
   ...More stuff...
}

public class Employee {

   private ContactInfo contactInfo;
   private String jobCode;
   private String department;
   ...More stuff...
}

public class Customer {

   private ContactInfo contactInfo;
   private String salesPerson;
   private Date registrationDate;
   ...More stuff...
}

由于Java没有多重继承,您可以实现多个接口,因此有时需要执行上述操作以确保您的开发干净易读。

我意识到这不是Java本身,而是Scala(一种运行在Java虚拟机上的语言)允许的(称为Scala中的traits)

mixin允许您将某些功能定位在现有类旁边,而不是在继承树中

当类包含mixin时 类实现接口和 包括而不是继承所有 mixin的属性和方法。 他们在上课期间成为了班级的一部分 汇编


是一种替代方案

我认为您应该尝试委托,委托是继承的替代方法。委派意味着您将另一个类的实例作为实例变量。它起到了一个有益的作用,它不会强迫您接受超类的所有方法。

尝试委托,也就是所谓的组合

还发现新的替代品为mixin

mixin是一种可组合的抽象类。它们在多重继承上下文中用于向类添加服务。多重继承用于用任意多个mixin组成类。例如,如果您有一个类来表示房屋,则可以从此类创建房屋,并通过继承Garage和Garden等类来扩展房屋。以下是用Scala编写的示例:

val myHouse=带车库和花园的新房子


您将获得有关混音的更多信息。“合成”是一个开始。您想做什么?你的局限性是什么?@Michael Krauklis-这是理论上的question@S.Lott-不,不是。不幸的是。@Registered User:如果这不是家庭作业,那么你应该提供一些你想做的事情的细节。这个问题是开放式的,模糊的,几乎不可能书面回答。我怀疑你错误地引用了这个问题。最初的帖子错误地引用了“偏爱继承而不是写作”,而不是相反。现在已经更正了,您的链接是函数组合,它在Java中不是继承的替代品。另外,我不知道你打算如何区分授权和组成。这确实没有给已经发布的答案增加任何内容。