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

Java 将子类中所需的方法添加到抽象类中会打破接口隔离原则吗?

Java 将子类中所需的方法添加到抽象类中会打破接口隔离原则吗?,java,oop,design-patterns,types,solid-principles,Java,Oop,Design Patterns,Types,Solid Principles,我有一个名为GameCharacter的抽象类,它有一些我需要的来自游戏角色的方法 还有另一个称为Cell的抽象类,它表示不同类型的单元格及其相关的操作 并不是每个细胞都是可传输的,我只需要为一个叫做GroundCell的细胞子类型设置一个游戏角色,它是可传输的 我的问题是: 如果我想实现(在单元中): public抽象空集字符(GameCharacter字符) …并且只定义它的主体在GroundCell中执行某些操作,而让它为其他类型的Cell留空。。。这是否会打破界面分离原则,或任何其他坚实

我有一个名为GameCharacter的抽象类,它有一些我需要的来自游戏角色的方法

还有另一个称为Cell的抽象类,它表示不同类型的单元格及其相关的操作

并不是每个细胞都是可传输的,我只需要为一个叫做GroundCell的细胞子类型设置一个游戏角色,它是可传输的

我的问题是:

如果我想实现(在单元中):

public抽象空集字符(GameCharacter字符)

…并且只定义它的主体在GroundCell中执行某些操作,而让它为其他类型的Cell留空。。。这是否会打破界面分离原则,或任何其他坚实的原则

我对在超类型中为一个特定类定义方法有一种不好的感觉,但我不想使用InstanceOf(),因为它打破了开闭原则


如果这不是一个实用的解决方案,那么什么样的解决方案不会破坏模块化设计?

或者您可以在单元格上设置一个
可转换
接口,并让GameCharacter设置其位置,如
公共抽象空置单元格(可转换单元格)。或者你可以创建一个抽象的TranstableCell来扩展Cell。在这种情况下,你应该担心的是LSP,而不是ISP。@RoddyOfFrozenpeas我也会遇到同样的情况,因为我需要遍历单元格集合。我还没有解决办法,所以我认为我正在做的是最好的解决方案,即使留下空的函数体看起来有点奇怪。@jaco0646 LSP当然是交易的一部分,因为它与主要的子类型问题有关,但是遵循它,我当然需要在抽象类中声明的操作,以便能够对存在的任何子类型调用它。问题是,代码在离开空体函数时有点异味。@JulianP LSP与避免意外/非直觉行为几乎相同。调用
nonTransitableCell.setCharacter(character)
时,您希望看到什么。如果它默默地失败了,界面上没有任何东西告诉我它可能会失败或不受支持,那么我会想为什么它适用于cell1而不适用于cell2。如果您有
public void setCharacter(character)抛出NotTransitableException
,它已经稍微好了一点(或者只是
IllegalStateException
)。它还可以返回一个布尔值,让您知道它是否被接受。或者您可以在单元格上有一个
IsTransitable
接口,并让GameCharacter设置其位置,如
public abstract void setCell(IsTransitable Cell)。或者你可以创建一个抽象的TranstableCell来扩展Cell。在这种情况下,你应该担心的是LSP,而不是ISP。@RoddyOfFrozenpeas我也会遇到同样的情况,因为我需要遍历单元格集合。我还没有解决办法,所以我认为我正在做的是最好的解决方案,即使留下空的函数体看起来有点奇怪。@jaco0646 LSP当然是交易的一部分,因为它与主要的子类型问题有关,但是遵循它,我当然需要在抽象类中声明的操作,以便能够对存在的任何子类型调用它。问题是,代码在离开空体函数时有点异味。@JulianP LSP与避免意外/非直觉行为几乎相同。调用
nonTransitableCell.setCharacter(character)
时,您希望看到什么。如果它默默地失败了,界面上没有任何东西告诉我它可能会失败或不受支持,那么我会想为什么它适用于cell1而不适用于cell2。如果您有
public void setCharacter(character)抛出NotTransitableException
,它已经稍微好了一点(或者只是
IllegalStateException
)。它还可以返回一个布尔值,让您知道它是否被接受。