C#接口(interface)知识及编程

来源:互联网 发布:亲爱的公主病 知乎 编辑:程序博客网 时间:2024/06/04 20:22

接口:

原则: 开放-关闭(注:意为对扩展开放,对內修改关闭)。

 

故事环境:

让我们根据具体的示例来看看接口的应用。

整个环境为:一只猫,一只老鼠,一只鸟,一个熟睡的人。猫看到老鼠,然后喵的叫了一声,此时主人由睡梦中惊醒,老鼠发现有人醒来,跑了,鸟飞了。一切又平静了。

 

以下为自己写的简单代码。

代码示例:

1. 各个对象的接口              // 接口中的方法属性不能生明为public 等

namespace ObserverModel
{
    interface IObject
    {
        void ProcessEvent(); // 各个对象要做的事情
    }
}

2. 对象“猫”的接口

namespace ObserverModel
{
    interface ICat
    {
        List<IObject> LstIObject { get;set;}// 接口中只有常量和方法的定义,没有方法的实现,没有变量定义,即使static类型的

                                                                 //变量 也不行,所以此处用属性
        void Add(IObject o_IObject);
        void Call();
        //static string strTest = "aaa";    //  此处会报错,所以不能定义变量
    }
}

3. 对象“人”的实现类

namespace ObserverModel
{
    class Person:IObject
    {
        public Person(ICat cat) // ICat类型的参数
        {
            cat.Add(this);
        }

        public void ProcessEvent()
        {
            Console.WriteLine("awake...");
        }
    }
}

4. 对象“老鼠”的实现类

namespace ObserverModel
{
    class Mouse:IObject
    {
        public Mouse(ICat cat) // ICat类型的参数
        {
            cat.Add(this);
        }

        public void ProcessEvent()
        {
            Console.WriteLine("run...");
        }
    }
}

5. 对象“鸟”的实现类

namespace ObserverModel
{
    class Bird:IObject
    {
        public Bird(ICat cat) // ICat类型的参数
        {
            cat.Add(this);
        }
        public void ProcessEvent()
        {
            Console.WriteLine("fly...");
        }
    }
}
6. 对象“猫”的实现类

namespace ObserverModel
{
    class Cat:ICat
    {
        List<IObject> _lstIObject = new List<IObject>();// 接口中只有常量和方法的定义,没有方法的实现,即使定义static类型

                                                                                     //的变量也不行 ,所以此用属性
        public List<IObject> LstIObject                 
        {
            get { return _lstIObject; }
            set { _lstIObject = value; }
        }


        public void Add(IObject o_IObject) // IObject类型的参数
        {
            this.LstIObject.Add(o_IObject);
        }

        public void Call()
        {
            foreach (IObject o_IObject in LstIObject)
            {
                o_IObject.ProcessEvent();
            }
        }
    }
}

 

7. 主程序

    class Program
    {
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Mouse mouse = new Mouse(cat);   // 此处参数类型为ICat,而cat 为Cat类型,之所以可以是因为Cat实现了接口,

                                                                   //既为class类型也为接口类型
            // 例如  start
            Cat testCat = new Cat();
            ICat testICat = testCat;     // 与写成ICat testICat = (ICat)testCat; 效果一直
            // 例如  end           

            Bird bird = new Bird(cat);
            Person person = new Person(cat);
            cat.Call();
            Console.Read();         // 运行结果  runing...  fly...  awake...
        }
    }
}

 

 

以下为个人觉得很好的接口编程的文章链接  http://www.cnblogs.com/Gavinzhao/archive/2009/11/10/1599700.html