看懂接口与抽象类的区别:
namespace ConsoleApp1 { public class A : A_A, I_A, I_B { public int CountB { get; set; } public void MethodA() { var NumA = 1; var a = base.NumA; var msg = base.GetString_AA(); var v_Msg = base.GetString_V_AA(); //错误:接口和抽象类不能被实例化 A_A a_A = new A_A(); I_A i_A = new I_A(); } public override string GetString_V_AA() { if (CountA == 1) return base.GetString_V_AA(); else return "MySelf"; } public override void GetList() { throw new System.NotImplementedException(); } } public class B:A { public void Test() { base.GetString_V_AA(); } } public abstract class A_A:I_A { public A_A() { } public int NumA { get; set; } public int CountA { get; set; } public virtual string GetString_V_AA() { return "AA.GetString_V_AA"; } public abstract void GetList(); public string GetString_AA() { return "AA.GetString_AA"; } public void SetCountA(int value) { throw new System.NotImplementedException(); } } public abstract class A_B { public int NumB { get; set; } } public interface I_A { int CountA { get; set; } void SetCountA(int value); } public interface I_B { int CountB { get; set; } //void SetCountB(int value); } }
相同:
1、接口和抽象类都可以被继承。
2、接口和抽象类都不能被实例化。
3、接口和抽象类都可以包含方法、字段、属性等声明。
4、接口和抽象类的子类必须实现未实现的方法,抽象类必须实现抽象方法,普通方法无需实现,接口必须实现。
异同:
1、抽象类可以有构造方法,接口中不能有构造方法。
2、抽象类中可以包含静态方法,接口中不能包含静态方法。
3、一个类可以实现多个接口,但只能继承一个抽象类。
4、如果抽象继承接口,那么抽象内中必须实现接口成员,抽象类的子类就算也继承了抽象类的接口,那么子类不必实现接口。