具体的 subclass 不会覆盖 abstract class 中的抽象方法
Concrete subclass that does not override abstract methods from abstract class
假设我在一个抽象基类中有两个抽象方法 class:
protected abstract void writeData(OutputStream stream);
protected abstract void writeData(Writer writer);
我在实现的时候,必须重写这些方法,这样当需要写数据的时候,它才知道怎么写。
我需要知道的是,如果我可以使 subclass 只需要覆盖其中一个方法,而不是两个方法。
另外,我想知道如何确定哪个方法被覆盖了。
这甚至可能吗?
简短的回答是否定的。
长答案是:abstract
class 中的 abstract
方法必须是子 class 中的 overridden
。如果您不想在 subclass 中仅重写其中一个方法,则 subclass 也必须声明为 abstract
。如果没有任何 static
字段或方法,这样的子 class 几乎没有用,因为它无法实例化,并且没有 class 的实例就无法访问实例字段或方法。
也就是说,Java 8 在 interface
中引入了默认方法的概念。您可以将摘要 class 转换为 interface
并将 writeData(OutputStream stream)
和 writeData(Writer writer)
标记为 default
:
public interface DataWriter {
public default void writeData(OutputStream stream) {
//no-behavior
}
public default void writeData(Writer writer) {
//no-behavior
}
}
以上代码类似于抽象class,不同于具体class,因为它不能被实例化。虽然这解决了您的问题,但我真的认为首先做这样的事情没有多大价值。
具体的子类必须覆盖所有 abstract
方法,或者必须更改为 abstract
本身。如果有多个 abstract
方法,则不能只覆盖一个。
根据您的要求,让一个具体的子类只覆盖其中一个重载的 abstract
方法是没有意义的。您可以尝试在您的抽象超类中仅使用 one writeData
方法,并使用泛型类型参数。
public abstract class MyClass<T extends Closeable & Flushable>
{
protected abstract void writeData(T t);
}
我添加了表示 OutputStream
和 Writer
之间公共接口的上限,但它们通常不是必需的。
然后您的具体子类(只需要重写一个方法)可以选择使用哪个类型参数。
class MyOutputStreamClass extends MyClass<OutputStream>
{
protected void writeData(OutputStream stream) { /* implement */ }
}
class MyWriterClass extends MyClass<Writer>
{
protected void writeData(Writer writer) { /* implement */ }
}
我想你要做的是只将一个方法声明为抽象方法。您不希望 subclass 重写的方法,您可以在此摘要 class 中提供其实现。
像这样:
protected abstract void writeData(OutputStream stream);
//the method you don't want subclass to override.
public void writeData(Writer writer)
{
//doSomething here
}
假设我在一个抽象基类中有两个抽象方法 class:
protected abstract void writeData(OutputStream stream);
protected abstract void writeData(Writer writer);
我在实现的时候,必须重写这些方法,这样当需要写数据的时候,它才知道怎么写。
我需要知道的是,如果我可以使 subclass 只需要覆盖其中一个方法,而不是两个方法。
另外,我想知道如何确定哪个方法被覆盖了。
这甚至可能吗?
简短的回答是否定的。
长答案是:abstract
class 中的 abstract
方法必须是子 class 中的 overridden
。如果您不想在 subclass 中仅重写其中一个方法,则 subclass 也必须声明为 abstract
。如果没有任何 static
字段或方法,这样的子 class 几乎没有用,因为它无法实例化,并且没有 class 的实例就无法访问实例字段或方法。
也就是说,Java 8 在 interface
中引入了默认方法的概念。您可以将摘要 class 转换为 interface
并将 writeData(OutputStream stream)
和 writeData(Writer writer)
标记为 default
:
public interface DataWriter {
public default void writeData(OutputStream stream) {
//no-behavior
}
public default void writeData(Writer writer) {
//no-behavior
}
}
以上代码类似于抽象class,不同于具体class,因为它不能被实例化。虽然这解决了您的问题,但我真的认为首先做这样的事情没有多大价值。
具体的子类必须覆盖所有 abstract
方法,或者必须更改为 abstract
本身。如果有多个 abstract
方法,则不能只覆盖一个。
根据您的要求,让一个具体的子类只覆盖其中一个重载的 abstract
方法是没有意义的。您可以尝试在您的抽象超类中仅使用 one writeData
方法,并使用泛型类型参数。
public abstract class MyClass<T extends Closeable & Flushable>
{
protected abstract void writeData(T t);
}
我添加了表示 OutputStream
和 Writer
之间公共接口的上限,但它们通常不是必需的。
然后您的具体子类(只需要重写一个方法)可以选择使用哪个类型参数。
class MyOutputStreamClass extends MyClass<OutputStream>
{
protected void writeData(OutputStream stream) { /* implement */ }
}
class MyWriterClass extends MyClass<Writer>
{
protected void writeData(Writer writer) { /* implement */ }
}
我想你要做的是只将一个方法声明为抽象方法。您不希望 subclass 重写的方法,您可以在此摘要 class 中提供其实现。
像这样:
protected abstract void writeData(OutputStream stream);
//the method you don't want subclass to override.
public void writeData(Writer writer)
{
//doSomething here
}