gpt4 book ai didi

java - 如何判断 is-a 或 instanceof 关系是否适合给定情况?

转载 作者:行者123 更新时间:2023-12-01 14:36:43 26 4
gpt4 key购买 nike

好吧,这种情况已经在我身上发生过很多次了,所以我不妨问问社区。我经常遇到一个问题,决定是否将某些东西声明为实例或 is-a 继承(并声明子类的实例)是否合适。

例如,

  public class BaseStation{
public BaseStation( int x, int y ){
this.x = x;
this.y = y;
}

public void setX( int x ){ this.x = x; }
public void setY( int y ){ this.y = y; }

private int x;
private int y;
}

现在,如果staticBaseStation是一个BaseStation,其(x,y)不改变,并且dynamicBaseStation is-a BaseStation(x,y) 会发生变化,我不能通过 dynamicBaseStation 调用将静态和动态 BaseStation 声明为单独的对象吗每次位置改变时setXsetY?但我觉得这样做违反了面向对象原则。

那么,当感觉就像额外的工作时,我该如何决定是否使用继承?

最佳答案

这取决于您如何定义类的契约。

a) 如果您指定 BaseStation 值可以更改(或者您没有指定它不能更改),则可以使用该类的两个实例。

b) 如果您指定 BaseStation 值不能更改,那么您不仅不能使用同一类的两个实例来实现该用途,而且甚至无法扩展 BaseStation获取您的DynamicBaseStation(因为子类会违反父类(super class)契约(Contract))。您可能需要设置一个通用接口(interface)。

您的契约(Contract)越严格,类的可重用性就越低。而且,由于类的行为得到了更好的定义,您可以使用其属性来简化类的使用/避免错误(a 方法可以让您更改 StaticBaseb 方法强制您使用另一个类(充其量是同级类)。

在这个具体类中,我将定义BaseStation,而不指定它不能移动,并创建一个StaticBaseStation来细化父契约(但不矛盾)但确认它不能改变其位置。通常,该过程是在继承(特化)过程中增加限制。

无论如何,这又是一条经验法则。可能还有其他动机迫使您以一种或另一种方式定义契约(Contract);重要的是扩展类时不要中断。

关于java - 如何判断 is-a 或 instanceof 关系是否适合给定情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16430446/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com