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("-----------------------------------"); } } } } }