多态和接口(5)——设计模式(2)——基于接口编程

一、基于接口编程

1、变量(参数、返回值等)的类型能用父类就不要用子类,能用接口就不要用类,返回值、属性、参数等等,类型越靠近Object越好,尽量不要用具体的类型。只要返回的类型符合签名的要求,就能够随意控制返回的对象。如果将返回值设置为NotNullArrayList,有一点不想控制非空值了,就直接返回ArrayList就可以了。

2、接口中的方法不能声明public、private等,因为没有意义,private是类内部互相调,哪儿来的类内部?接口中能声明:方法,属性,索引器,不能声明字段。接口跟类是平行的。

3、接口的多态。

4、一个接口变量可以指向实现了这个接口的类的对象,不能指向没有实现这个接口的类的对象

5、子类继承父类,也实现了父类已经实现了的接口

6、设计模式。世界上本没有模式,用的人多了,也就有了模式!别把设计模式当成相对论来学!弄明白了多态就明白了设计模式。

7、面试题:接口中能定义什么?接口中可以定义方法、属性、索引器。因为属性、索引器本质上也是方法。接口中不能定义字段,因为字段是实现

8、一个类只能有一个父类,一个类可以实现多个接口。接口只能决定能干什么,怎么干由类来实现

9、

class Program
    {
        static void Main(string[] args)
        {
            //ISpeakable p1 = new Dog();
            //p1.Speak();

            ISpeakable p2 = CreateChatter(-1);//接口的优点。不管返回的是什么类型对象,只要能Speak就行
            p2.Speak();//调用的不是ISpeakable接口的方法,而是p2指向的对象的Speak方法

            Console.ReadKey();
        }

        static ISpeakable CreateChatter(int i)
        {
            if (i < 0)
            {
                return new Dog();
            }
            else if (i == 0)
            {
                return new Cat();
            }
            else
            {
                return new Bird();
            }
        }
    }

    interface ISpeakable//接口定义的是一种能力。
    {
        void Speak();
        //面试题:接口中能定义什么?
        //接口中可以定义方法、属性、索引器。因为属性、索引器本质上也是方法。
        //接口中不能定义字段,因为字段是实现。
    }

    interface IFlyable
    {
        void Fly();
    }

    class Dog : ISpeakable
    {
        #region ISpeakable 成员

        public void Speak()
        {
            Console.WriteLine("我是狗狗!");
        }

        #endregion
    }

    class Cat : ISpeakable
    {
        #region ISpeakable 成员

        public void Speak()
        {
            Console.WriteLine("我是猫!");
        }

        #endregion
    }

    //一个类只能有一个父类
    //一个类可以实现多个接口。接口只能决定能干什么,怎么干由类来实现
    class Bird : ISpeakable, IFlyable
    {
        #region ISpeakable 成员

        public void Speak()
        {
            Console.WriteLine("我是鸟!");
        }

        #endregion

        #region IFlyable 成员

        public void Fly()
        {
            Console.WriteLine("灰呀灰!");
        }

        #endregion
    }

}

二、基于接口编程:Max、排序

10、对List<Person>进行排序,自定义类实现IComparer<Person>接口。

11、IComparer 接口声明:int Compare(T x, T y):<0则x<y;=0则x==y;>0则x>y。

12、list.Max(new PersonComparer())

13、Max方法内部调用实现IComparer接口的对象,调用Compare进行排序,具体如何比较两个对象的大小,则是由实现类决定。

14、重用不变的(排序算法)、定制变化的(大小比较)。

15、开闭原则:对变化开放,对修改封闭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值