如何决定使用IS A还是HAS A Relation

时间:2011-06-18 10:29:48

标签: oop

public class B {

    public String getMe()
    {
        return "Some";
    }
}

假设我有一个上面的类,我们应该通过哪个参数决定使用什么?是一个关系还是一个关系?

HAS - A

public class A {



    public static void main(String args[])
    {
        B b = new B();
        System.out.println(b.getMe());
    }
}

public class A  extends B
{


    public static void main(String args[])
    {
        A b = new A();
        System.out.println(b.getMe());
    }
}

4 个答案:

答案 0 :(得分:22)

取决于逻辑关系。它只需要有意义。

示例:

假设您有动物课程 所以你有这些课程:动物,狗,猫,豹,毛皮,脚

猫与狗是A 动物 豹是A Cat。
动物 HAS A 毛皮,脚。

简而言之:

IS A 关系意味着您继承并扩展基类的功能 HAS 关系意味着该类正在使用另一个类,因此它将其作为成员。

答案 1 :(得分:17)

有四种类型的关系:

  • 泛化(IS A):这是使用上面的继承实现的。当A类具有B的所有相同功能并且您想要添加更多功能时使用它。所以你只需要扩展B并添加新功能。
  • 聚合(HAS A):这种关系比泛化有点弱。当A的对象拥有B的对象或由B的对象组成时(可以是其他类的其他对象),可以使用此关系。第一种类型称为共享聚合,第二种称为组合。在聚合和组合中,通常有一个对象控制另一个对象的生命(它实例化它并在需要时销毁它)。
  • 关联:在关联中,这些类只是相互了解,因此它比聚合弱。对象不会控制彼此的生命。
  • 用法:这是两个类中最弱的关系,它意味着一个类可能在方法参数中显示为一个类型,或者在代码内部使用。

    在您的示例中,如果A具有类型B的字段,则它应该是聚合(HAS A)。但是如果它只是在内部创建要在代码中使用的B的实例,并且当范围结束时该对象从内存中释放,那么它既不是IS A也不是HAS A.它只是一种使用关系。

答案 2 :(得分:1)

简单来说:

  • “是”代表继承/延伸
  • “有一个”代表委托/协会

例如:

  • House是建筑物(继承)
  • House有一扇门(协会)

以下是我用于理解OOP的最佳资源之一:http://chortle.ccsu.edu/CS151/cs151java.html(第6部分和第10部分)

答案 3 :(得分:0)

is-a 就好比如,狗是动物猫是动物或者它就像“一个人”是那种人“。 Is-a关系具有其他对象的属性,例如“ Animal ”是一个类(对象)等。

has-a 关系就像,一个对象有自己的属性,例如,Fish有Gills或裤子有口袋......就像那样。