Java 在扩展超类功能时屏蔽超类功能

Java 在扩展超类功能时屏蔽超类功能,java,inheritance,architecture,Java,Inheritance,Architecture,类“B”扩展“A”并屏蔽其某些功能是否有意义?例如,将以下代码放在我们要在中屏蔽的函数的顶部: if subclass type is B don't execute the function else execute the function 这是否与软件设计中继承的一般思想相矛盾 我认为这样做是设计上的错误。不是说它不起作用,如果你有一个B扩展了A,你不想让B执行A的一些函数,就重写它们,让它们为空 class A { function myFunction() { do so

类“B”扩展“A”并屏蔽其某些功能是否有意义?例如,将以下代码放在我们要在中屏蔽的函数的顶部:

if subclass type is B
  don't execute the function
else 
  execute the function 

这是否与软件设计中继承的一般思想相矛盾

我认为这样做是设计上的错误。不是说它不起作用,如果你有一个B扩展了A,你不想让B执行A的一些函数,就重写它们,让它们为空

class A {
function myFunction() { do some stuffs and forbidden to be executed by B}
}
class B extends A {
@Override
function myFunction() {}
}
但我仍然认为这不是一件很干净的事情。
我总是这样做:如果你需要一些B不能执行的函数,只需创建一个子类C来扩展a,让a尽可能干净。

我认为这样做是设计上的错误。不是说它不起作用,如果你有一个B扩展了A,你不想让B执行A的一些函数,就重写它们,让它们为空

class A {
function myFunction() { do some stuffs and forbidden to be executed by B}
}
class B extends A {
@Override
function myFunction() {}
}
但我仍然认为这不是一件很干净的事情。
我总是这样做:如果你需要一些B不能执行的函数,只需要创建一个子类C来扩展a,让a尽可能干净。

正如@rilent在技术上提到的,你可以用空的实现覆盖基本方法。但在我看来,这是一个糟糕的设计。我相信即使是@rilent也同意这一点

若子类不应该支持特定的行为(比如方法),那个么这样的行为可以/不应该使用父类/超类/基类(无论什么)进行抽象。这样的抽象总是会导致子类中的空方法,或者至多会抛出未实现的异常(这更糟)

看看下面的例子,你们就会明白我想解释什么

Bird {
    Mate();
    Fly();
    Swim();
}

Eagle : Bird {
    Mate() { /* :) */ }
    Fly() { /* Oh come on, of course I can. */ }
    Swim() { /* Oops, sorry I can't. */ }
}

Penguin : Bird {
    Mate() { /* :) */ }
    Fly() { /* Sorry I'm a flightless bird. */ }
    Swim() { /* Yeah, I can do this well. */ }
}
现在你明白我为什么说这是个糟糕的设计了。就是没道理,对吧?那么我们能做什么呢

接口

您可以使用接口而不是继承来抽象特定的行为。我会重新考虑以上的课程,并有这样的东西
Fly()
Swim()
分别由
ICanFly
icansim
定义

Bird {
    Mate();
}

Eagle : Bird, ICanFly {
    Mate() { }
    Fly() { }
}

Penguin : Bird, ICanSwim {
    Mate() { }
    Swim() { }
}

.

正如@rilent在技术上提到的,您可能只是用空的实现覆盖基本方法。但在我看来,这是一个糟糕的设计。我相信即使是@rilent也同意这一点

若子类不应该支持特定的行为(比如方法),那个么这样的行为可以/不应该使用父类/超类/基类(无论什么)进行抽象。这样的抽象总是会导致子类中的空方法,或者至多会抛出未实现的异常(这更糟)

看看下面的例子,你们就会明白我想解释什么

Bird {
    Mate();
    Fly();
    Swim();
}

Eagle : Bird {
    Mate() { /* :) */ }
    Fly() { /* Oh come on, of course I can. */ }
    Swim() { /* Oops, sorry I can't. */ }
}

Penguin : Bird {
    Mate() { /* :) */ }
    Fly() { /* Sorry I'm a flightless bird. */ }
    Swim() { /* Yeah, I can do this well. */ }
}
现在你明白我为什么说这是个糟糕的设计了。就是没道理,对吧?那么我们能做什么呢

接口

您可以使用接口而不是继承来抽象特定的行为。我会重新考虑以上的课程,并有这样的东西
Fly()
Swim()
分别由
ICanFly
icansim
定义

Bird {
    Mate();
}

Eagle : Bird, ICanFly {
    Mate() { }
    Fly() { }
}

Penguin : Bird, ICanSwim {
    Mate() { }
    Swim() { }
}

.

你需要提到你正在使用的编程语言。这是一个关于软件设计的一般性问题,但我会提到Java。你需要提到你正在使用的编程语言。这是一个关于软件设计的一般性问题,但我会提到Java。