接口 interface

1. 接口和抽象类有很多共同点, 都是声明变量, 不能被实例化. 并且其中的方法都不提供实现代码.
2. 接口的任何派生类型(类或接口)都必须继承该接口定义的所有方法, 并且其派生类如果是非抽象的, 则必须实现接口的所有方法.
   抽象类的派生类必须继承其所有抽象方法, 并且其派生类如果是非抽象的, 则必须实现抽象类的所有抽象方法.

3. 接口抽象化更高, 接口的方法全是抽象方法, 而抽象类中的方法可以有抽象方法也可以有非抽象方法. 另外, 接口还不能有字段成员.

4. 如果派生类既继承了类又继承了接口, 则定义时先写基类再写接口. 如: class creditcard : bankcard,Iloan
   接口定义时 方法上不用访问限制修饰符.
   多接口定义了相同方法, 而派生类又继承了这些接口, 则用一个方法即可实现. 如果要区分, 可以用 "接口名.方法名" 写多个相同方法.

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApp
{
    class InheritSample
    {
        public static void Main()
        {
            Business c1 = new Business("赵丽");
            c1.title = "经理";
            c1["办公电话"] = "010-1234567";
            Family c2 = new Family("王强");
            c2.Relation = "表弟";
            c2.Birthday = new DateTime(1980, 12, 1);
            c2["手机"] = "13801284321";
            
            //因为Bussiness通过重载Output方法实现多态,故强两次调用output方法的输出是相同的
            c1.Output();
            Console.WriteLine("----------------------------");
            ((Contact)c1).Output();
            Console.WriteLine("----------------------------");
            ((IOutput)c1).Output();
            Console.WriteLine("----------------------------");
            c2.Output();
            Console.WriteLine("----------------------------");
            ((Contact)c2).Output();

            Console.Read();
        }
    }

    //接口:可输出IOutput
    public interface IOutput
    {
        void Output();
    }

    public class Contact : IOutput, IComparable
    {
        protected string m_name;
        protected string m_homePhone = "未知";
        protected string m_busiPhone = "未知";
        protected string m_mobilePhone = "未知";

        public string Name
        {
            get { return m_name; }
            set { m_name = value; }
        }

        public virtual string this[string phoneType]  //带参数分支的属性  索引函数
        {
            get
            {
                switch (phoneType)
                {
                    case "住宅电话":
                        return m_homePhone;
                    case "办公电话":
                        return m_busiPhone;
                    case "手机":
                        return m_mobilePhone;
                    default:
                        return null;
                }
            }
            set
            {
                switch (phoneType)
                {
                    case "住宅电话":
                        m_homePhone = value;
                        break;
                    case "办公电话":
                        m_busiPhone = value;
                        break;
                    case "手机":
                        m_mobilePhone = value;
                        break;
                    default:
                        break;
                }
            }
        }

        public Contact(string name)
        {
            m_name = name;
        }

        public virtual void Output()
        {
            Console.WriteLine("姓名:{0}", m_name);
            Console.WriteLine("住宅电话:{0}", m_homePhone);
            Console.WriteLine("办公电话:{0}", m_busiPhone);
            Console.WriteLine("手机:{0}", m_mobilePhone);
        }

        public int CompareTo(object obj)
        {
            if (obj is Contact)
            {
                return m_name.CompareTo(((Contact)obj).m_name);
            }
            return -1;
        }
    }

    //派生类:商务Business
    public class Business : Contact, IOutput
    {
        protected string m_busiFax = "未知";
        protected string m_title = "女士/先生";

        public string title
        {
            get { return m_title; }
            set { m_title = value; }
        }

        public override string this[string phoneType]
        {
            //使用base简化为↓
            get
            {
                switch (phoneType)
                {
                    case "传真":
                        return m_busiFax;
                    default:
                        return base[phoneType];
                }
            }
            set
            {
                switch (phoneType)
                {
                    case "传真":
                        m_busiFax = value;
                        break;
                    default:
                        base[phoneType] = value;
                        break;
                }
            }
        }

        public Business(string name) : base(name) { }

        //重载基类方法
        public override void Output()
        {
            base.Output();
            Console.WriteLine("传真:{0}", m_busiFax);
        }

        //实现接口方法
        void IOutput.Output()
        {
            Console.WriteLine(m_name + m_title);
            Console.WriteLine("(B){0} (F){1} (H){2} (M){3} ", m_busiPhone, m_busiFax, m_homePhone, m_mobilePhone);
        }
    }

    public class Family : Contact
    {
        protected string m_relation;
        protected DateTime m_birthday;

        public string Relation
        {
            get { return m_relation; }
            set { m_relation = value; }
        }

        public DateTime Birthday
        {
            get { return m_birthday; }
            set { m_birthday = value; }
        }

        public Family(string name) : base(name) { }

        //覆盖
        public new void Output()
        {
            Console.WriteLine(m_relation + m_name);
            Console.WriteLine("生日:{0}", m_birthday);
            Console.WriteLine("(B){0} (H){1} (M){2} ", m_busiPhone, m_homePhone, m_mobilePhone);
        }
    }
}

   姓名:赵丽
住宅电话:未知
办公电话:010-1234567
手机:未知
传真:未知
----------------------------
姓名:赵丽
住宅电话:未知
办公电话:010-1234567
手机:未知
传真:未知
----------------------------
赵丽经理
(B)010-1234567 (F)未知 (H)未知 (M)未知
----------------------------
表弟王强
生日:1980-12-1 0:00:00
(B)未知 (H)未知 (M)13801284321
----------------------------
姓名:王强
住宅电话:未知
办公电话:未知
手机:13801284321

http://www.cnblogs.com/streetpasser/archive/2012/11/30/2796337.html  <ConsoleApp2引入ConsoleApp>

using System;
using System.Collections.Generic;
using System.Text;

using ConsoleApp;  //引入

namespace ConsoleApp
{
    class InheritSample2
    {
        public static void Main()
        {
            Business c1 = new Business("赵丽");
            c1.title = "经理";
            c1["办公电话"] = "010-1234567";

            Family c2 = new Family("王强");
            c2.Relation = "表弟";
            c2.Birthday = new DateTime(1980, 12, 1);
            c2["手机"] = "13801284321";

            //调用
            ContactAssemble asm = new ContactAssemble(10);
            asm.SetAt(0,c1);
            asm.SetAt(1, c2);
            asm.Output();
            Console.WriteLine();
            ((IOutput )asm).Output();

            Console.Read();
        }
    }

    //集合接口 -- 可使用不同的数据结构来实现
    public interface IAssemble
    {
        int length { get;}                   //取得集合长度
        object GetAt(int index);             //读取集合元素
        void SetAt(int index, object obj);   //设置集合元素
    }

    //抽象类: 集合CzAssemble
    public abstract class CzAssemble : IAssemble
    {
        protected object[] m_list;

        public int length
        {
            get { return m_list.Length; }
        }

        public CzAssemble(int length)
        {
            m_list = new object[length];
        }

        public virtual object GetAt(int index)
        {
            return m_list[index];
        }

        public virtual void SetAt(int index, object obj)
        {
            m_list[index] = obj;
        }
    }

    //派生类:联系人集合
    public class ContactAssemble : CzAssemble, IOutput
    {
        public ContactAssemble(int length) : base(length) { }

        public new Contact GetAt(int index)
        {
            return (Contact)m_list[index];
        }

        public void SetAt(int index, Contact c)
        {
            m_list[index] = c;
        }

        public void Output()
        {
            foreach (Contact c in m_list)
            {
                if (c != null)
                {
                    c.Output();
                    Console.WriteLine("-------------------------");
                }
            }
        }

        void IOutput.Output()
        {
            foreach (Contact c in m_list)
            {
                if (c != null)
                {
                    ((IOutput )c).Output();
                    Console.WriteLine("-------------------------");
                }
            }
        }

    }

}

 姓名:赵丽
住宅电话:未知
办公电话:010-1234567
手机:未知
传真:未知
-------------------------
姓名:王强
住宅电话:未知
办公电话:未知
手机:13801284321
-------------------------

赵丽经理
(B)010-1234567 (F)未知 (H)未知 (M)未知
-------------------------
姓名:王强
住宅电话:未知
办公电话:未知
手机:13801284321
-------------------------

使用ArrayList

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections ;
using ConsoleApp;  //引入

namespace ConsoleAppl3
{
    class InheritSample3
    {
        static void Main(string[] args)
        {
            Business c1 = new Business("赵丽");
            c1.title = "经理";
            c1["办公电话"] = "010-1234567";

            Family c2 = new Family("王强");
            c2.Relation = "表弟";
            c2.Birthday = new DateTime(1980, 12, 1);
            c2["手机"] = "13801284321";

            ContactAssemble asm = new ContactAssemble(10);
            asm.Add(c1);
            asm.Add(c2);
            asm.Output();
            Console.WriteLine();
            ((IOutput)asm).Output();

            Console.Read();
        }
    }

    public class ContactAssemble : ArrayList, IOutput
    {
        public ContactAssemble(int length) : base(length) { }
        public void Output()
        {
            foreach (Contact c in this)
            {
                if (c != null)
                {
                    c.Output();
                    Console.WriteLine("-----------------------------------");
                }
            }
        }

        void IOutput.Output()
        {
            foreach (Contact c in this)
            {
                if (c != null)
                {
                    ((IOutput )c).Output();
                    Console.WriteLine("-----------------------------------");
                }
            }
        }
    }

    
}
原文地址:https://www.cnblogs.com/streetpasser/p/2794744.html