抽象类和接口


什么是抽象类?


抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用new关键字,也不能被密封。


什么是接口?


接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口是核心,其定义了要做的事情,包含了许多的方法,但没有定义这些方法应该如何做。接口方法不能包含任何实现。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

 

对于抽象类和接口找了两个实例

 

抽象类:http://wenku.baidu.com/view/79c4833eeefdc8d376ee32e8.html

接口:http://www.cnblogs.com/zhangzt/archive/2009/11/28/1612556.html

这两个实例中分别应用的是接口和抽象类实现,当我需要添加其他类型的枪支或是其他的程序员,都可以很容易的添加,扩充性很好,这样使得我们的代码更容易维护!当然这两个实例都很简单,这样的话感觉两者没有什么区别。

 

下面说一下他们的区别:


1,接口支持多继承;抽象类不能实现多继承。举例当使用抽象类时,由于不能实现多继承,这时,需求改变需要添加新的功能,我们就可以用接口实现。

               

2,抽象类里面的方法可以有实现,但是接口里面的方法确是只能声明

3,抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现

 

理解:


1,类是对对象的抽象,抽象类是对类的抽象,接口是对行为的抽象

2,如果行为跨越不同类的对象,可使用接口,对于一些相似的类对象,用继承抽象类

3,从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本布置子类的存在,方法如何实现还不确认,预先定义。

4,实现接口和继承抽象类并不冲突。

 例如:

//1. 定义抽象类

    public abstract class Animal
    {
        protected string _name;

        //声明抽象属性
        public abstract string Name
        {
            get;
        }

        //声明抽象方法
        public abstract void Show();

        //实现一般方法
        public void MakeVoice()
        {
            Console.WriteLine("All animals can make voice!");
        }
    }

//2. 定义接口

    public interface IAction
    {
        //定义公共方法标签
        void Move();
    }

//3. 实现抽象类和接口


    public class Duck : Animal, IAction
    {
        public Duck(string name)
        {
            _name = name;
        }

        //重载抽象方法
        public override void Show()
        {
            Console.WriteLine(_name + " is showing for you.");
        }

        //重载抽象属性
        public override string Name
        {
            get { return _name;}
        }

        //实现接口方法
        public void Move()
        {
            Console.WriteLine("Duck also can swim.");
        }

    }

    public class Dog : Animal, IAction
    {
        public Dog(string name)
        {
            _name = name;
        }

        public override void Show()
        {
            Console.WriteLine(_name + " is showing for you.");
        }

        public override string Name
        {
            get { return _name; }
        }

        public void Move()
        {
            Console.WriteLine(_name + " also can run.");
        }

    }

//4. 客户端实现


    public class TestAnmial
    {
        public static void Main(string [] args)
        {
            Animal duck = new Duck("Duck");
            duck.MakeVoice();
            duck.Show();

            Animal dog = new Dog("Dog");
            dog.MakeVoice();
            dog.Show();

            IAction dogAction = new Dog("A big dog");
            dogAction.Move();
        }
    }

    如果某一些类的实现有共通之处,则可以抽象出来一个抽象类,让抽象类实现接口的公用的代码,而那些个性化的方法则由各个子类去实现。

所以,抽象类是为了简化接口的实现,他不仅提供了公共方法的实现,让你可以快速开发,又允许你的类完全可以自己实现所有的方法,不会出现紧耦合的问题。

 

应用场合很简单了 (接口是设计的结果,抽象类是重构的结果)


1 优先定义接口

2如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。

 

通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才。



评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值