抽象類與接口

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

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

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

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

 

3、抽象類與接口區別:
一、一個類一次能够多個接口,但只能實現一個抽象類。
二、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,固然您也能够声明为虚的
三、(接口)与非抽象类相似,抽象类也必须为在该类的基类列表中列出的接口的全部成员提供它本身的实现。可是,容许抽象类将接口方法  
      映射到抽象方法上。
四、好的接口定义应该是具备专注功能性的,而不是多功能的,不然形成接口污染。
4、抽象类和接口的使用:spa

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

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

3.若是要设计大的功能单元,则使用抽象类.若是要在组件的全部实现间提供通用的已实现功能,则使用抽象类。htm

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

如下是我在网上看到的几个形象比喻,真的很是不错,呵呵:blog

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

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

相关文章
相关标签/搜索