Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.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_Inheritance_Super - Fatal编程技术网

Java 重写父类中的特定行

Java 重写父类中的特定行,java,inheritance,super,Java,Inheritance,Super,我有一个类Writer,它有一个方法process()。一个子类TextWriter,扩展了Writer 我想使用父类的方法process(),方法的最后一行除外,我想根据子类的需要对其进行自定义 是否有任何方法可以调用super(),使我只能继承父类方法的特定部分 我知道这是一种糟糕的设计,在这种情况下必须使用接口。但是我正在对一些旧代码进行一些更改,我想知道是否有可能做到这一点。不,这在Java中是不可能的 如果您可以控制父类,则可以重构它以确保可以重写相关部分。如果没有,您就没有其他选择。

我有一个类
Writer
,它有一个方法
process()
。一个子类
TextWriter
,扩展了
Writer

我想使用父类的方法
process()
,方法的最后一行除外,我想根据子类的需要对其进行自定义

是否有任何方法可以调用
super()
,使我只能继承父类方法的特定部分


我知道这是一种糟糕的设计,在这种情况下必须使用接口。但是我正在对一些旧代码进行一些更改,我想知道是否有可能做到这一点。

不,这在Java中是不可能的


如果您可以控制父类,则可以重构它以确保可以重写相关部分。如果没有,您就没有其他选择。

不,您不能这样做。

最好的方法是在您的子类中使用该方法并执行特定的工作。

否,但您可以将两个类之间不同的部分提取到另一个方法中,该方法在每个类中实现不同。

否,您不能重写某一段代码。重写与方法相关,而不是与某行代码相关。您应该将联合代码放在受保护的方法中,并让process方法调用它,如:

public class Writer {


    protected void process_subProcess(){
        //most of process code
    }

    public void process(){
        process_subProcess();
        //specific last line

    }
}
然后TextWriter只覆盖它需要的位。子过程不是一个好名字,考虑一个更好的子进程,取决于子进程实际上做了什么?
public class TextWriter extends Writer{

    @Override
    public void process(){
        process_subProcess();
        //different final line
    }

}

联合代码是受保护的,这样子类就可以访问它,但您不能意外地从包外使用subProcess方法

我只是想提一提,我知道这是不可能的,但这将是一种语言的一个很棒的特性。我知道你可以把东西分解成更小的方法,等等,然后覆盖那个小的一行方法,但它会对性能产生很大影响,所以,拥有它会很好。我来自c#,实际上使用.tt文件解决了这个问题,如下所示,我有一个类A,它有一些代码行,我使用.tt文件生成类B,它只是克隆了它,但修改了我想要的一行或多行。我为自己工作。如果我把某个东西固定在A中,它就固定在B中automatically@IronHide那感觉有点可怕。一个类应该被允许在它认为合适的时候改变它的实现。如果一个消费类已经连接到一个特定的行上,在这个消费类上做一件非常特定的事情,那么这个消费类永远不会改变任何事情。一个类的概念是,它的外部表面有一个公共api,内部有一个私有api;这都是公开的,我并不是说它在整个OOP、SOLID等方面都是正确的,但是,如果你的首要任务是性能,我们知道函数调用越多,性能受到的影响就越大,那么这就是我解决问题的方法,但是的,这不是一个可扩展的、易于维护和理解的东西,但它确实有效。另一方面,有时您重写一个方法只是因为一行不同,或者条件不同,但其余的都是一样的。如果支持语言,那就更好了。不知何故,在语句级别重写。