zoukankan      html  css  js  c++  java
  • c# 接口(interface)与接口应用

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    //接口(interface)
    //接口(interface)定义了一个可由类和结构实现的协定。接口可以包含方法、属性、事件和索引器。
    //接口不提供它所定义的成员的实现——它仅指定实现该接口的类或结构必须提供的成员。
    //
    //接口
    //1、一个接口声明可以声明零个或多个成员。
    //2、接口的成员必须是方法、属性、时间或索引器。
    //3、接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型,也不能包含任何种类的静态成员。
    //4、所有接口成员都隐式地具有Public访问属性。
    //5、接口成员声明中包含任何修饰符都属于编译时错误。具体来说,不能使用修饰符abstract、public、protected、
    //internal、private、virtual、override或static来声明接口成员。
    namespace 接口
    {
        //定义一个接口
        interface IDrivingLicenceB
        {
            void GetLicence();
        }
        //IDrivingLicenceA接口继承与IDrivingLicenceB
        interface IDrivingLicenceA : IDrivingLicenceB
        {
            new void GetLicence();
        }
        //老师类
        class Teacher : IDrivingLicenceA
        {
            void IDrivingLicenceB.GetLicence()
            {
                Console.WriteLine("老师获得了B类驾驶执照");
            }
            void IDrivingLicenceA.GetLicence()
            {
                Console.WriteLine("老师获得了A类驾驶执照");
            }
            public void GetLicence()
            {
                Console.WriteLine("这个不是接口的方法");
            }
        }
        //学生类
        class Student : IDrivingLicenceB
        {
            void IDrivingLicenceB.GetLicence()
            {
                Console.WriteLine("学生获得了B类驾驶执照");
            }
            public void GetLicence()
            {
                Console.WriteLine("这个不是接口的方法");
            }
        }
        class Program
        {
            static void DriveCar(string name, IDrivingLicenceB o)
            {
                IDrivingLicenceB d1 = o as IDrivingLicenceB;
                if (d1 != null) //实现了IDrivingLicenceB接口的情况
                {
                    d1.GetLicence();
                    Console.WriteLine(name + "开动了卡车");
                }
                else
                {
                    Console.WriteLine(name + "没有驾驶执照,不能开卡车");
                }
            }
            static void DriveBus(string name, IDrivingLicenceB o)
            {
                IDrivingLicenceA d1 = o as IDrivingLicenceA;
                if (d1 != null) //实现了IDrivingLicenceA接口的情况
                {
                    d1.GetLicence();
                    Console.WriteLine(name + "开动了公共汽车");
                }
                else
                {
                    Console.WriteLine(name + "没有驾驶执照,不能开公共汽车");
                }
            }
            static void Main(string[] args)
            {
                Teacher t = new Teacher();
                DriveCar("教师", t);
                DriveBus("教师", t);
                Student s = new Student();
                DriveCar("学生", s);
                DriveBus("学生", s);
                Console.ReadKey();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace 接口的多继承
    {
        interface IA
        {
            void F();
        }
        interface IB : IA
        {
            new void F();
        }
        interface IC : IA
        {
            void G();
        }
        interface IBC : IB, IC
        {
    
        }
        class Derive : IBC
        {
            public void F()
            {
                Console.WriteLine("IB.F()");
            }
            public void G()
            {
                Console.WriteLine("IC.G()");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Derive d = new Derive();
                ((IA)d).F();  //"IB.F()"
                ((IB)d).F();  //"IB.F()"
                ((IC)d).F();  //"IB.F()"
                ((IBC)d).F(); //"IB.F()"
                Console.ReadKey();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    //接口重新实现
    //一个类若继承了某个接口的实现,则只要将该接口列入它的基类列表中,就可以重新实现(re-implement)该接口。
    //接口的重新实现与接口的初始实现遵循完全相同的接口映射规则。因此,继承的接口映射不会对为重新实现该接口而
    //建立的接口映射产生任何影响。
    namespace 接口的多继承1
    {
        interface IA
        {
            void F();
        }
        class B : IA
        {
            void IA.F()
            {
                Console.WriteLine("B.F()");
            }
        }
        class C : B, IA
        {
            //void IA.F()
            //{
            //    Console.WriteLine("C.B.F()");
            //}
            public void F()
            {
                Console.WriteLine("C.F()");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                C c = new C();
                ((IA)c).F();  //"C.F()"
                Console.ReadKey();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    //接口与抽象类
    //1、抽象类用于部分实现一个类,再由用户按需求对其进行不同的扩展和完善;接口只是定义一个行为的规范或规定。
    //2、抽象类在组件的所有实现间提供通用的已实现功能;接口创建在大范围全异对象间使用的功能。
    //3、抽象类主要用于关系密切的对象;而接口适合为不相关提供通用功能。
    //4、抽象类主要用于设计大的功能单元;而接口用于设计小而简练的功能块。
    namespace 接口的多态
    {
        //员工类
        interface IEmployee
        {
            void StartWork();
        }
        //经理类
        class Manager : IEmployee
        {
            private string _name;
            public Manager(string name)
            {
                _name = name;
            }
            public void StartWork()
            {
                Console.WriteLine(_name + "给员工下达任务");
            }
        }
        //秘书类
        class Secretary : IEmployee
        {
            private string _name;
            public Secretary(string name)
            {
                _name = name;
            }
            public void StartWork()
            {
                Console.WriteLine(_name + "协助经理");
            }
        }
        //销售类
        class Seller : IEmployee
        {
            private string _name;
            public Seller(string name)
            {
                _name = name;
            }
            public void StartWork()
            {
                Console.WriteLine(_name + "销售产品");
            }
        }
        //财务类
        class Accountant : IEmployee
        {
            private string _name;
            public Accountant(string name)
            {
                _name = name;
            }
            public void StartWork()
            {
                Console.WriteLine(_name + "管理公司财政");
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                IEmployee[] emp = new IEmployee[5];
                emp[0] = new Manager("张三");
                emp[1] = new Secretary("李四");
                emp[2] = new Seller("王五");
                emp[3] = new Seller("马六");
                emp[4] = new Accountant("钱七");
                Console.WriteLine("早上8点,开始工作");
                foreach (IEmployee e in emp)
                {
                    e.StartWork();
                }
                Console.ReadKey();
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Collections;
    //Array.Sort(Array array)使用IComparable接口CompareTo方法,实现对象类型排序。
    //Array.Sort(Array array, IComparer comparer) 使用IComparer接口Compare方法,进行排序。
    namespace 接口应用
    {
        class Student : IComparable
        {
            private string _name;
            private int _age;
            public Student(string name, int age)
            {
                _name = name;
                _age = age;
            }
    
            public string Name
            {
                get { return _name; }
                set { _name = value; }
            }
    
            public int Age
            {
                get { return _age; }
                set { _age = value; }
            }
            int IComparable.CompareTo(object right)
            {
                if (!(right is Student))
                {
                    throw new ArgumentException("参数必须为Student类型");
                }
                return _name.CompareTo(((Student)right)._name);  
            }
            public int CompareTo(Student right)
            {
                return _name.CompareTo(right._name);  
            }
            private static AgeIComparer _ageCom = null;  //创建一个私有的静态的AgeIComparer类对象,并设置为空。
    
            public static IComparer AgeCom  //给_ageCom字段加上属性
            {
                get
                {
                    if (_ageCom == null)
                    {
                        _ageCom = new AgeIComparer(); //实例化内部类
                    }
                    return _ageCom;
                }
            }
            private class AgeIComparer : IComparer
            {
                int IComparer.Compare(object left, object right)
                {
                    if (!(left is Student) || !(right is Student))
                    {
                        throw new AccessViolationException("参数必须为Student类型");
                    }
                    return ((Student)left)._age.CompareTo(((Student)right)._age); //根据年龄排序
                }
            }
    
            public override string ToString()
            {
                return _name + "  " + _age;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Student[] arr = new Student[5];
                arr[0] = new Student("张三", 5);
                arr[1] = new Student("李四", 3);
                arr[2] = new Student("王五", 2);
                arr[3] = new Student("马六", 4);
                arr[4] = new Student("钱七", 1);
                Console.WriteLine("对姓名进行排序");
                Array.Sort(arr);
                foreach (Student i in arr)
                {
                    Console.WriteLine(i);
                }
                Console.WriteLine("对年龄进行排序");
                Array.Sort(arr, Student.AgeCom);
                foreach (Student i in arr)
                {
                    Console.WriteLine(i.Name + "  " + i.Age);
                }
                Console.ReadKey();
            }
        }
    }
  • 相关阅读:
    View基础知识
    数据库性能优化之SQL优化
    poi读取Excel文件和图片
    ab压测工具的一些个人见解
    【压测工具对比系列施压对比】
    【压测工具对比系列性能对比】
    【转】linux sed命令详解
    linux下文件比对功能
    windows下自动更改IP的小工具(bat批处理文件)
    mysql中操作符LIKE与通配符%的使用
  • 原文地址:https://www.cnblogs.com/han1982/p/3203337.html
Copyright © 2011-2022 走看看