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