其他分享
首页 > 其他分享> > 抽象類與接口

抽象類與接口

作者:互联网

參考文章:http://www.cftea.com/c/2012/03/5522.asp;http://blog.sina.com.cn/s/blog_4aaeba510100c4y6.html
一、抽象方法:好處:靈活的實現代碼的重用,子類重寫(override); 抽象的目的是我无法实现它,由继承我的类来实现
1、a、抽象類的方法必須是抽象方法,不然報錯;
     b、屬性不一定要為抽象屬性。
2、a、一個類只能繼承一個抽象類;
     b、abstract 與private、virtual、static不能同時使用;
     c、抽象類不能實例化。
3、抽象類的抽象方法、抽象屬性在其一般子類中必須重寫(重寫訪問性要一致),且抽象屬性的讀、寫情況要一致。
4、抽象類的抽象方法、抽象屬性在其抽象子類中不一定要重寫,但重寫的必須要實現,未重寫的在其子類中必須重寫實現。
5、繼承抽象類的子類可以再次重寫繼承抽象類繼承的方法屬性。
6、不能对字段抽象(因为字段只能用等号赋值,没其他代码(不同于属性),没啥抽象的意义)。
例子:

public abstract class PhoneAbsstract//抽象類的方法必須是抽象方法,不然報錯;屬性不一定要為抽象屬性。
    {
        public abstract void 通話();
        public abstract void 照相();
        public abstract void 上網();

        private int _size = 0;
        public int size
        {
            get { return _size; }
            set { _size = size; }
        }

        public abstract int weight { get;}
    }

    public class Phone1 : PhoneAbsstract//抽象類的抽象方法、抽象屬性在其一般子類中必須重寫(重寫訪問性要一致),且抽象屬性的讀、寫情況要一致。
    {
        public override void 通話()
        {
            Console.Write("我可以打電話。");
        }
        public override void 照相()
        {
            Console.Write("我可以打照相。");
        }
        public override void 上網()
        {
            Console.Write("我可以上網。");
        }

        private int _weight = 0;
        public override int weight {
            get { return _weight; }
        }
    }

    public abstract class IPhoneAbstract : PhoneAbsstract//抽象類的抽象方法、抽象屬性在其抽象子類中不一定要重寫,但重寫的必須要實現
    {
        public override void 通話()
        {
            Console.Write("IPhone手機可以打電話。");
        }
        public override void 上網() //繼承抽象類的子類可以再次重寫繼承抽象類繼承的方法屬性。
        {
            Console.Write("IPhone手機可以上網。");
        }
        private int _weight = 0;
        public override int weight
        {
            get { return _weight; }
        }    
    }

    public class IPhone1 : IPhoneAbstract//未重寫的在其子類中必須重寫實現
    {
        public override void 上網()
        {
            Console.Write("IPhone手機可以上網。");
        }
        public override void 照相()
        {
            Console.Write("IPhone手機可以照相。");
        }
    }
View Code

二、接口:實現多態; 接口的目的是提供一个标准让大家来遵守,不用知道大家如何實現;簡單工廠模式應用(利用多態);
1、接口只能是public,實現接口也必須public;
2、能實現多個接口,但繼承的所有接口的方法必須都要實現;
例子:簡單工廠模式

class Program
    {
        static void Main(string[] args)
        {
            phone2 p2=new phone2();
            camera c = new camera();
            SimplenessFactory.照相(p2);
            SimplenessFactory.照相(c);
            Console.Read();
        }
    }
    public class SimplenessFactory//簡單工程模式應用接口
    {
        public static void 照相(照相設備接口 photo)
        {
            photo.照相();
        }
    }

public interface 通話設備接口//接口只能public
    {
        void 通話();
    }

    public interface 照相設備接口
    {
        void 照相();
        int size { get; }
    }

    public interface 上網設備接口
    {
        void 上網();
    }

    public class phone1 : 通話設備接口//實現接口的類必須public
    {
        public void 通話()//必須public
        {
            Console.WriteLine("電話1打電話了。");
        }
    }

    public class phone2 : 通話設備接口, 照相設備接口, 上網設備接口//能實現多個接口,但繼承的所有接口的方法必須都要實現
    {
        public void 通話()
        {
            Console.WriteLine("電話2打電話了。");
        }

        public void 照相()
        {
            Console.WriteLine("電話2照相了。");
        }

        public void 上網()
        {
            Console.WriteLine("電話2上網了。");
        }

        public int size {
            get { return 100; }
        }//屬性也必須實現,其必須是public
    }

    public class camera : 照相設備接口
    {
        public void 照相()
        {
            Console.WriteLine("相機照相了。");
        }
        public int size
        {
            get { return 200; }
        }//屬性也必須實現,其必須是public
    }
View Code

 

三、抽象類與接口區別:
1、一個類一次可以多個接口,但只能實現一個抽象類。
2、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的
3、(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法  
      映射到抽象方法上。
4、好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。
四、抽象类和接口的使用:

1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。

2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。

3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。

4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

以下是我在网上看到的几个形象比喻,真的非常不错,呵呵:

1.飞机会飞,鸟会飞,他们都继承了同一个接口“飞”;但是F22属于飞机抽象类,鸽子属于鸟抽象类。

2. 就像铁门木门都是门(抽象类),你想要个门我给不了(不能实例化),但我可以给你个具体的铁门或木门(多态);而且只能是门,你不能说它是窗(单继承);一个门可以有锁(接口)也可以有门铃(多实现)。门(抽象类)定义了你是什么,接口(锁)规定了你能做什么(一个接口最好只能做一件事,你不能要求锁也能发出声音吧(接口污染)。

标签:必須,void,實現,抽象,接口,public,類與
来源: https://www.cnblogs.com/Hyman-Zheng/p/11076413.html