抽象类

一、描述

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

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

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

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

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

 

posted @ 2016-02-18 14:04  zmztyas  阅读(167)  评论(0)    收藏  举报