10

根据我收集到的信息,我想强制一个类使用特定的私有字段(和方法)我需要一个抽象类,因为接口只声明公共/静态/最终字段和方法。正确的??

我刚开始我的第一个大型 Java 项目,想确保以后不会伤害自己 :)

4

11 回答 11

20

您不想强制使用某些私有字段或方法。一般来说,你不关心实现,你关心的是接口。所以在几个接口中定义几个方法(取决于你需要多少)并定义实现它们的类。这可能在未来对你的伤害最小。

于 2009-01-20T17:20:57.083 回答
20

两者都提供是很常见的,因此您最终会得到:

public interface Sendable {
    public void sendMe();
}

public abstract class AbstractSender implements Sendable {
    public abstract void send();

    public void sendMe() {
        send(this.toString());
    }
}

这样,任何对抽象类中的默认实现感到满意的人都可以快速子类化它而无需重写大量代码,但任何需要做更复杂的事情(或需要从不同的基类继承)的人仍然可以实现接口和即插即用。

于 2009-01-20T17:54:47.547 回答
4

子类不能使用私有字段和方法(除非它们也是内部类)。但是,您可以使它们受到保护。

于 2009-01-20T17:16:56.280 回答
3

接口定义了这一点 - 与实现类之外的世界的接口(合同)。(抽象与否)超类的公共方法也是如此。您不应该尝试要求子类具有某些私有成员 - 您正在尝试指定实现,而这正是 OOP 所要避免的。

当您想在超类中定义一些共享行为时,您可以使用抽象类 - 但该类不能独立存在(它需要被子类化)。可能是共享行为需要它自己的某种状态——在这种情况下,它可以定义私有字段,并且它也可能具有只有它才能使用的私有方法。

即使您从抽象类继承,您也无法访问其私有字段/方法。

于 2009-01-20T17:21:05.507 回答
1

这是对的。但这不一定是一个非此即彼的决定,您可以通过提供一个骨架实现以及您的接口来结合接口和抽象类的优点。您可以在Effective Java, 2nd Ed中找到关于这种方法的非常有趣的描述。, Item 18 ("Prefer interfaces to abstract classes")。

于 2009-01-20T17:16:46.343 回答
1

这是正确的。接口供公众使用。私有实现需要在抽象(或具体)类中。

于 2009-01-20T17:17:10.087 回答
1

如果您发现自己在猜测选择哪个接口,我建议您在接口方面犯错 - 最好有一个应该是抽象类的接口,而不是相反。

于 2009-01-20T17:19:15.357 回答
1

接口定义了行为契约。这就是他们需要做的,而不是属性。

于 2009-01-20T17:44:02.373 回答
1
我想强制一个类使用特定的私有字段(和方法)

你问题的这一部分是有问题的:你认为你为什么要这样做?

私有成员对子类不可见,并且接口定义了公共接口,因此您唯一的选择是使用抽象类......但我想不出任何人想要这样做的任何理由

于 2009-01-20T18:15:26.350 回答
0

如果你想让子类定义特定的方法,使用接口就可以了。正如其他人所说,与其说是子类是如何做到的,不如说是它做到这一点。

于 2009-01-20T17:52:06.133 回答
0

如果您希望一个类使用另一个类的某些字段或方法,您可以将它们声明为受保护。

    public abstract class A {

      protected Object thing;
    }

可以被同一个包中的另一个类访问(可以是扩展类 A,也可以不是)

A a = new A();
a.thing.toString();

不过,这并不是真正“强迫”另一个类使用它,更像是“启用”。

于 2010-04-13T03:29:34.553 回答