How to decide whether use IS A or HAS A Relation

2019-03-09 05:35发布

问题:

public class B {

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

Assume that i have a above class , by which parameters should we decide what to use ?? Whether is a or Has a Relation ??

HAS - A

public class A {



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

or

public class A  extends B
{


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

回答1:

Depends on the logical relation. It just needs to make sense.

Example:

Lets say you have Animal classes.
So you have these classes: Animal, Dog, Cat , Leopard, Fur, Feet

Cat and Dog IS A Animal.
Leopard IS A Cat.
Animal HAS A Fur, Feet.

In a nutshell:

IS A relationship means you inherit and extend the functionality of the base class.
HAS A relationship means the class is using another class, so it has it as a member.



回答2:

There are 4 types of relations possible :

  • Generalization (IS A) : Which is implemented using inheritance like you did above. It's used when class A has all the same feature of B and you want to add some more features. So you simply extend B and add the new features.
  • Aggregation (HAS A) : This is a bit weaker relation than generalization. You use this relation when the object of A owns objects of B or is composed of objects of B (may be among other objects of other classes). The first type is called shared aggregation, the second is called composition. In aggregation and composition there usually an object controlling the life of the other object (it instantiates it and destroys it as it needs).
  • Association: In association, the classes simply know about each other's so it's weaker than aggregation. The objects do not control each other's life.
  • Usage : It's the weakest relation of two classes and it means simply that one class may appear as a type in a method parameter or is used internally in code.

    In your example, it should be aggregation (HAS A) if A has a field of type B. But if it just creates instance of B to be used in code internally and the object is disposed from memory when the scope ends then it's neither IS A nor HAS A. It's just a usage relation.



回答3:

In simple term:

  • "is a" represent the inheritence/extends
  • "has a" represents the delegation/association

for example:

  • House is a Building (inheritance)
  • House has a door(s) (association)

Here is one of the best resources I used for understanding OOP: http://chortle.ccsu.edu/CS151/cs151java.html (part 6 & 10)



回答4:

is-a is like for example, a Dog is an Animal or a Cat is an Animal or It is like "a person is that-kind of a person". Is-a relationships have other objects' properties, like here "Animal" is a class(object) and etc.

The has-a relationship is like, an object has its own properties, for example, Fish has Gills or pants have pockets ... something like that.



标签: oop