我正在阅读"The Java Tutorial"(第二次).我刚刚完成了关于接口的部分(再次),但仍然不了解Java接口如何模拟多重继承.是否有比书中更清楚的解释?
我正在研究我的设计模式,我在编码中尚未认真使用的一种模式是装饰模式.
我理解这种模式,但我想知道的是现实世界中一些具体的例子,装饰者模式是最佳/最佳/优雅的解决方案.需要装饰器模式的特定情况非常方便.
谢谢.
我已经在SO上阅读了关于实现接口和抽象类的多篇帖子.我特别想找到一个我想链接的地方 - 链接 - 接口与默认方法vs抽象类,它涵盖了同样的问题.作为公认的答案,建议在可能的情况下使用接口的默认方法.但是这个答案下面的评论说"这个功能对我来说更像是黑客"解释了我的问题.
引入了默认方法以使接口的实现更加灵活 - 当接口发生更改时,实现类中不一定需要(重新)编写代码.因此,使用接口的默认方法只是为了实现所有实现类中的方法 - 引用:"感觉更像是对我的黑客攻击".
课程概述:
结合这些:
水是物品并实施消耗品; Stone也是一个项目,并没有实现消耗品.
我想实现一个所有项目必须实现的方法.因此,我在类Item中声明了签名.
protected abstract boolean isConsumable();
//return true if class implements (or rather "is consumable") Consumable and false in case it does not
Run Code Online (Sandbox Code Playgroud)
快速编辑:我知道instanceof可以解决这个特定的例子 - 如果可能的话,想一个更复杂的例子,这使得有必要首先实现该方法.(感谢Sp00m和Eugene)
现在我有几个选择:
- 在Item的每个子类中手动实现该方法(在扩展应用程序时绝对不可能).
如上所述,当缩放应用程序时,这将是不切实际或非常低效的.
- 在接口内部实现方法作为默认方法,因此Consumable类已经实现了超类Item所需的方法.
这是其他帖子推荐的解决方案 - 我看到以这种方式实现它的优势:
引用 - "关于这个新功能的好处是,在你被迫使用抽象类来实现方便方法之前,从而将实现者限制为单继承,现在你可以只使用接口和一个非常干净的设计最少的实施工作强加给程序员." 链接
但在我看来,我在介绍中提到的默认方法的最初想法似乎仍然是矛盾的.此外,在扩展应用程序并引入更多共享相同实现的方法(作为示例方法isConsumable())时,接口将实现几个默认方法,这与未实现实际方法的接口的想法相矛盾.
- 引入子超类而不是接口 - 例如类Consumable作为Item的抽象子类和Water的超类.
它提供了为Item(示例isConsumable() //return false:)中的方法编写默认大小写的机会,然后在子超类中重写它.此处出现的问题:在扩展应用程序并引入更多子超类(作为Consumable类)时,实际的Items将开始扩展多个子超类.这可能不是一件坏事,因为它也必须对接口做同样的事情,但它使继承树变得复杂 - 示例:一个项目现在可能扩展子类别ALayer2,它是ALayer1的子超类,它扩展了Item(layer0) . …
我有一个People类,并Student和Employee类从它继承.但是,如果我有一个既是一个Student又一个Employee......
......你将如何实现这一目标?
我有一个车辆类,并且有良好的船舶和飞机检查安全性,每个级别都实施自己的安全检查.世界很好.
interface Vehicle {
public void safetyCheck();
}
class Ship implements Vehicle {
@Override
public void safetyCheck() {
//check if number of lifeboats >= number of passengers
}
}
class Plane implements Vehicle {
@Override
public void safetyCheck() {
//check if oxygen mask is in place.
}
}
Run Code Online (Sandbox Code Playgroud)
但很快,需要的混合称为水上飞机其中重复的安全检查Ship和Plane
class SeaPlane implements Vehicle {
@Override
public void safetyCheck() {
//check if oxygen mask is in place.
// &&
//check if number of lifeboats >= number of passengers …Run Code Online (Sandbox Code Playgroud) 我找不到这个继承问题的解决方案。我正在开发一个程序,该程序将存储有关天体的信息。我有一个抽象超类,Body,所有其他天体都应该从它继承。现在,我希望一些天体在默认情况下实现用于存储有关轨道天体的信息;有些机构应该是Orbitable,有些机构应该是Orbital。例如,恒星是orbitable唯一的,行星和卫星都是orbitable和orbital,而小行星是orbital唯一的。
public abstract class Orbital {
Body host;
protected double avgOrbitalRadius;
protected double orbitalPeriod;
public double getOrbitalRadius(){return this.avgOrbitalRadius;}
public double getOrbitalPeriod(){return this.orbitalPeriod;}
}
Run Code Online (Sandbox Code Playgroud)
public abstract class Orbitable {
List<Body> satellites = new ArrayList<>();
public void addSatellite(Body sat){
satellites.add(sat);
}
public boolean hasSatellite(Body sat){
for(Body body : satellites){
if(sat.equals(body)) return true;
}
return false;
}
public boolean hasSatellite(String satName){
for(Body body : satellites){
if(satName.equals(body.getName())) return true;
} …Run Code Online (Sandbox Code Playgroud) 可以在Java类的子类都InputStream和OutputStream?
如果可能的话,我希望能够扩展这两个类.
我试图理解并完成尝试创建一个扩展接受所有类的类的泛型类的类的任务.到目前为止,我有这个工作.我正在尝试创建一个扩展通用holder类的类,并让该类只接受特定的对象.
例如,一个名为"ComputerOrder"的类,它不接受Apple或Orange对象,只接受ComputerPart或Peripheral对象,例如Motherboard或Printer对象.被困在这2周了.我不能为我的生活想出这个概念.任何帮助,将不胜感激.
abstract class Product{
protected float price;
abstract float price();
public String toString() {
return "Price = " + String.valueOf(price) + " ";
}
}
class Apple extends Product{}
class Orange extends Product{}
class ComputerPart extends Product{
public ComputerPart(float p){
price = p;
}
public float price() {
return price;
}
}
class Motherboard extends ComputerPart{
protected String manufacturer;
public Motherboard(String mfg, float p) {
super(p);
manufacturer = mfg;
}
public String getManufacturer() {
return manufacturer;
}
}
class …Run Code Online (Sandbox Code Playgroud) 我知道具体的 Thread 类和 Java 中的 Runnable Interface 之间的区别。需要什么使 Thread 类可重写以便可供使用?所有线程都可以通过实现Runnable接口来创建吗?需要 Thread 类的用例是什么?为什么我们有两种方法来解决同一个问题?
编辑:我知道 Thread 类是 Runnable 实现的容器,我想知道是否有任何用例是 Runnable 实现无法解决的
这个程序似乎在使用多重继承.但是Java不支持多重继承,那么这个程序是如何工作的呢?
这是什么代码背后的原因在编译的时候两个类Student和Professor继承的基类Person?
class Person
{
private String name;
private int age;
private int val;
private int value(int sal)
{
return sal/100;
}
public Person(String name, int age, int sal)
{
this.name = name;
this.age = age;
val = value(sal);
}
public void valOverride(int val)
{
this.val = val;
}
public String getName()
{
return name;
}
public int getAge()
{
return age;
}
public int getVal()
{
return val;
}
}
class Student extends …Run Code Online (Sandbox Code Playgroud)