Java 在扩展超类功能时屏蔽超类功能
类“B”扩展“A”并屏蔽其某些功能是否有意义?例如,将以下代码放在我们要在中屏蔽的函数的顶部: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
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。