接口与抽象类

=======================================

这里我也来说说接口和抽象类,权当抛砖引玉了,一直到现在,我自己对接口和抽象类的区别都还是比较模糊,这里有什么不对的,就请提出来,

但请不要有过激言论,这里的很多言论我都参考网上的,不知道能不能算自己的原创发到首页。

 

抽象类与接口的不同,请大家参考再谈抽象类与接口的区别,我也就不说了,那什么时候选 抽象类,又什么时候选接口呢,好现在我来说一种情况。

 

现在我定义一个人的类,简单起见,我略写,如下:

    public abstract class Person

    {

        public abstract float GetWeight();

}

好了,现在我又有一个歌唱家,显然,他是一个人,好说继承,如下:

    public abstract class Singer : Person

    {

        public abstract void SingSong();

}

现在,我又有一个舞蹈家,显然,这也简单,他也是人,也好说继承,如下:

    public abstract class Dancer : Person

    {

        public abstract void Dance();

}

到现在一切都很好 ,也没有任何的问题,可是,又来了一个人,他说他又会唱歌,又会跳舞,我叫这个类为SingerDancer,好,我在定义一个类,

    public abstract class SingerDancer : Singer, Dancer

可是这样对吗?C#里面是不准许多继承的,这是不允许编译通过的,从另一个层面讲,这个明显的违反了单一职责的原则,那这里是不能用抽象类的。

我们再来一个例子:

鸟是可以飞的,这就没有问题,好,先定义 一个类先,如下:

    public abstract class Bird

    {

        public abstract void Fly();

}

在他之上,乌鸦,鸽子,好说,

    public abstract class Crow : Bird

    {

}

public abstract class Pigeon : Bird

    {

}

似乎都很好,没有问题,可是,突然有一天,你在电视里看到说,企鹅也是一种鸟,但是不会飞,这下,你就不好办了,如果,你把这个企鹅类也一样的继承Bird类吗?

public abstract class Penguin : Bird

    {

}

可是这样就不好了,你的基类Bird明显就这样设计就不好,明显就有了他不该有的方法。

基于上面的两个例子,接口的威力也就显示也来了,好重新上面的人的例子,用接口来做,

还是一个人类:

public abstract class Dancer : Person

    {

        public abstract void Dance();

}

对于歌唱家,我们可以这样:

public interface ISing

    {

        void SingSong();

}

    public abstract class Singer : Person, ISing

    {

        public void SingSong()

        {

        }

}

同样,对于舞蹈家,我们可以这样,

    public interface IDance

    {

        void Dance();

    }

 

    public abstract class Dancer : Person, IDance

    {

        public void Dance()

        {

        }

}

对于一个SingerDancer就可以这样比较好的做了,

public abstract class SingerDancer : Person, ISing, IDance

    {

        public void SingSong()

        {

        }

 

        public void Dance()

        {

        }

}

对于Bird,同样的,我们也可以这样来做,下面我就直接给出示例来好了:

    public abstract class Bird

    {

    }

 

    public interface IFly

    {

        void Fly();

    }

 

    public abstract class Crow : Bird, IFly

    {

    }

 

    public abstract class Pigeon : Bird, IFly

    {

    }

 

    public abstract class Penguin : Bird

    {

}

这样是不是比较好的解决了上面由抽象类而带来的问题呢。

那什么时候用接口呢,也就是在进行行为建模的时候来用接口类,在自己类的固有属性的时候就用抽象类。

posted @ 2009-03-01 19:55  connoryan  阅读(3110)  评论(20编辑  收藏  举报