抽象类
一、描述
1、在C#中使用关键字 abstract 来定义抽象类和抽象方法。
2、包含了一个或多个虚成员或虚方法的类叫抽象类,且不能被实例化(初始化);
3、抽象类也是类,具有类的性质。抽象类倾向于作为其他类的基类成员,或被包含进一个抽象类。
二、抽象类使用实例:(简单例子)
(1)抽象类可以包含非抽象方法或非抽象成员等,但是包含抽象方法或抽象成员等的类一定是抽象类
public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage(); } public class MyLanguage:StudyLanguage { public override void AbsLanguage() { Console.WriteLine("Please speak Abstract-Language"); } } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.AbsLanguage(); _myLanguage.EnglisthLanguage(); Console.ReadKey(); }
(2)一个非抽象类继承抽象类时,那么这个派生类必须实现所有的基类抽象方法或成员等。
public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage1(); public abstract void AbsLanguage2(); } public class MyLanguage:StudyLanguage { public override void AbsLanguage1() { Console.WriteLine("Please speak Abstract-Language1"); } public override void AbsLanguage2()//该方法若不实现,则会报错 { Console.WriteLine("Please speak Abstract-Language2"); } } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.AbsLanguage1(); _myLanguage.EnglisthLanguage(); _myLanguage.AbsLanguage2();//可以不调用 Console.ReadKey(); }
(3)通过声明派生类也是抽象的,就可以避免所有或特定的虚方法的实现,也就是抽象类的部分实现
public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage1(); public abstract void AbsLanguage2(); } public abstract class MyAbsLanguage:StudyLanguage { public override void AbsLanguage1() { Console.WriteLine("I am Studying Abstrict-Language1"); } } public class MyLanguage:MyAbsLanguage { public override void AbsLanguage2() { Console.WriteLine("I am Studying Abstrict-Language2"); } } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.AbsLanguage1(); _myLanguage.EnglisthLanguage(); _myLanguage.AbsLanguage2();//可以不调用 Console.ReadKey(); }
(4)抽象类也可以从一个接口来实现,我们必须为所有的方法(来自接口)来提供方法体(因为接口中的方法或属性都是抽象的没有实现的,所以需要重写)
interface ILanguage { void Method1(); void method2(); } public abstract class MyAbsLanguage:ILanguage { public void Method1() { Console.WriteLine("Method implemented from the IInterface1"); } public void method2()//如果去掉该方法,则会报错(因为接口有两个抽象方法) { Console.WriteLine("Method implemented from the IInterface2"); } } public class MyLanguage: MyAbsLanguage,ILanguage { //public void Method1() //{ // Console.WriteLine("1"); //} //public void method2() //{ // Console.WriteLine("2"); //} } static void Main(string[] args) { MyLanguage _myLanguage = new MyLanguage(); _myLanguage.Method1(); _myLanguage.method2();//可以不调用 Console.ReadKey(); }
(5)我们不能把关键字abstract 和 sealed 一起用在C#中,因为一个密封类不能够被抽象。
public abstract class StudyLanguage { public void EnglisthLanguage() { Console.WriteLine("Please speak EnglishLanguage"); } public abstract void AbsLanguage1(); public abstract void AbsLanguage2(); } public abstract class MyAbsLanguage:StudyLanguage { public sealed override void AbsLanguage1()//当用到sealed时则在其派生类中将不再被重写 { Console.WriteLine("Do not speak AbsLanguage1"); } } public class MyLanguage: MyAbsLanguage { public override void AbsLanguage2() { Console.WriteLine("Do not speak AbsLanguage2"); } }

浙公网安备 33010602011771号