接口与抽象类

   这几天在写一个记账管理的小程序,在这个程序中遇到了可能很多人都要遇到的问题。

  一,接口的使用

  二,接口和抽象类

  问题一,接口的使用

  如下的列子

interface IFly
    {
        void Fly();
    }

    class Bird : IFly
    {
        public void Eat()
        {
       
        }

        #region 实现接口

        public void Fly()
        {
            //用翅膀飞
        }

        #endregion
    }

    class Plan : IFly
    {
        #region IFly 成员

        public void Fly()
        {
            //喷气飞行
        }

        #endregion
    }

    static class Mid
    {
        public static IFly GetBirdFly()
        {
            return new Bird();
        }

        public static IFly GetPlanFly()
        {
            return new Plan();
        }
    }

    class Test
    {
        IFly Birds = Mid.GetBirdFly();
        public void Tests()
        {
            Birds.Fly();
            Birds.Eat();//错误。找不到相关的方法!
        }
    }

 

从上面的列子可以看出,当你申明了一个接口以后。你只是说明了 继承这个接口的类 可以做什么

具体怎么做。需要你再派生类中实现!

当你公布一个接口,并给出相应的静态方法时。使用者只能使用该接口的方法,而不可以使用那么是派

生类中的公共方法!

 

这时候会有人说。这样的话。抽象类 也可以实现。

没错。抽象类也可以完成上面的功能;

 

这时候我们再对上面的列子进行拓展!

比如。我们现在要详细区分各种类型的鸟,飞机

如,喷气飞机,战斗机

鹰,鸽子

这时我们要对上面的代码进行修改

先让我们完全用接口来实现

interface IFly
    {
        void Fly();
    }

    interface I攻击
    {
        void 攻击();
    }

    interface I吃加油
    {
        void 吃();
    }

    interface I乘坐
    {
        void 乘坐();
    }

    interface I送信
    {
        void 送信();
    }

    class 喷气飞机 : IFly, I乘坐,I吃加油
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region II乘坐 成员

        public void 乘坐()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成员

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    class 战斗机 : IFly, I乘坐, I吃加油,I攻击
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I乘坐 成员

        public void 乘坐()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成员

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I攻击 成员

        public void 攻击()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    class 鹰 : IFly, I吃加油, I攻击
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成员

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I攻击 成员

        public void 攻击()
        {
            throw new NotImplementedException();
        }

        #endregion
    }

    class 鸽子 : IFly, I吃加油, I送信
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I吃加油 成员

        public void 吃()
        {
            throw new NotImplementedException();
        }

        #endregion

        #region I送信 成员

        public void 送信()
        {
            throw new NotImplementedException();
        }

        #endregion
    }


如上述的情况。我们如使用抽象类,则实现起来就比较复杂,因为类只能继承一个抽象类。
我们不得不为每个具体的实例类去写合适的抽象类。
但是似乎上面的代码又显得有些啰嗦。如 喷气飞机和战斗机,他们都有局部相同性,他们都是飞机,他

们要加油,都可以飞,都可以乘坐,唯一的不同是,喷气飞机不能攻击,而战斗机可以攻击。
鹰和鸽子也一样,他们都具有相同的行为,同时有具有不同的行为
我们修改下面的方法
interface IFly
    {
        void Fly();
    }

    interface I攻击
    {
        void 攻击();
    }

    interface I送信
    {
        void 送信();
    }

    abstract class 飞机
    {
        public abstract void 乘坐();

        public abstract void 加油();
    }

    abstract class 鸟
    {
        public abstract void 吃();
    }

    class 喷气飞机 : 飞机,IFly
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion      
   
        public override void 乘坐()
        {
            throw new NotImplementedException();
        }

        public override void 加油()
        {
            throw new NotImplementedException();
        }
    }

    class 战斗机 : 飞机,IFly,I攻击
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion
       
        #region I攻击 成员

        public void 攻击()
        {
            throw new NotImplementedException();
        }

        #endregion

        public override void 乘坐()
        {
            throw new NotImplementedException();
        }

        public override void 加油()
        {
            throw new NotImplementedException();
        }
    }

    class 鹰 : 鸟,IFly,  I攻击
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion       

        #region I攻击 成员

        public void 攻击()
        {
            throw new NotImplementedException();
        }

        #endregion

        public override void 吃()
        {
            throw new NotImplementedException();
        }
    }

    class 鸽子 :鸟, IFly, I送信
    {

        #region IFly 成员

        public void Fly()
        {
            throw new NotImplementedException();
        }

        #endregion


        #region I送信 成员

        public void 送信()
        {
            throw new NotImplementedException();
        }

        #endregion

        public override void 吃()
        {
            throw new NotImplementedException();
        }
    }

这次我们使用了抽象类来定义了两个抽象的事物,1 飞机,2鸟,他是抽象的,我们无法从飞机或者鸟中

给你一个具体的飞机,或者一只具体的鸟,但是所有的飞机和鸟都有这个抽象的行为,或者能力,
同时。不同的实例有具有不同的能力,如 攻击,和送信。
当然。我们可以再飞机的抽象类中加入一个飞的方法
但是我们使用接口来做是因为,鸟也可以飞,
这两类不同的事物再这里有相同的行为,只不过他们的实现不同而已。

我认为接口和抽象类并不存在用这个好,用那个不好的情况,我认为要从他们中级找出一个分界线,他

们在一个程序中应该根据程序的需求而相互扶助,已达到期望的效果

这就是我这几天所理解的接口和抽象类,不知道理解的是否正确,还希望大家指点!

posted @ 2009-03-10 09:19  KindSoul  阅读(914)  评论(9编辑  收藏  举报