欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

抽象类和接口

程序员文章站 2024-02-17 16:48:34
...


什么是抽象类?


抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法,因此对抽象类不能使用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如果有多个接口实现有公用的部分,则使用抽象类,然后集成它。

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