原文url:http://blog.csdn.net/loveyou128144/article/details/4749576

@Is-A,Has-A,Use-A则是用来描述类与类之间关系的。简单的说Is-A代表继承,Has-A代表合成,Use-A代表依赖。

1,Is-A继承关系:“表示类与类之间的继承关系、接口与接口之间的继承的关系以及类对接口实现的关系”。如:

---对象的继承关系是在编译时就定好了,所以无法在运行时改变从父类继承的实现。子类的实现与它的父类有非常紧密的依赖关系,以至于父类实现中的任何变化必然会导致子类发生变化。当你需要复用子类时,如果继承下来的实现不适合解决新的问题,则父类必须重写或被其他更适合的类替换。这种依赖关系限制了灵活性并最终限制了复用性。

---继承是一种强耦合的结构,父类变,子类就必须要变

---is-a,一个圆形就是一个几何形状。圆形可以继承几何形状几何形状圆形抽象

public abstract class A

{

   ……

}

public class B : A

{

  ……

}

B类继承自A类,那么B类和A类的关系就是Is-A的关系。

2,Has-A合成关系:“是关联关系的一种,是整体和部分(通常为一个私有的变量)之间的关系,并且代表的整体对象负责构建和销毁代表部分对象,代表部分的对象不能共享”。如:

    public class Heart

    {

       ……

    }

    public class Man

    {

        private Heart heart = new Heart();

       ……

    }

Man类和Heart类便是Has-A关系,人死的时候心也就死了(当然有心脏移植,不想抬杠,哈哈),人和心是一种比较强的拥有关系,并且心是不能共享的。

---这里有详细的继承和组合关系的介绍:http://www.cnblogs.com/feichengwulai/articles/4137395.html

3,Use-A依赖关系:“是类与类(通常为函数的参数)之间的连接,依赖总是单向的”。

     public abstract class Course

    {

        ……

    }

    public class Student

    {

        public void Learn(Course course)

        {

           ……

        }

   }

Student类和Course的关系就是Use-A关系,Student类总是单向指向Course,学生知道自己学的是什么课程,而课程根本不关心它被哪个学生学习。

关于继承与组合Gof的《设计模式》中有很好的讨论,依赖关系现在很多人都提倡倒转的依赖,也是面向对象原则中的依赖倒转原则:要依赖于抽象(抽象类、接口或委托变量)不要依赖于具体。(本来昨天写了第一篇介绍C#的is,as,结果丢了,所以这篇是第二篇,有空补上)

posted on 2014-03-29 15:04  学到老死  阅读(6567)  评论(1编辑  收藏  举报