C#接口及抽象类以及虚方法

C#接口及抽象类以及虚方法
一.接口
一个比喻:
众所周知,我们的电脑,需要连接外接设备,比如U盘,需要通过USB连接,那么问题来了,世界上生产U盘的厂家有千万个,怎么保证他们生产的U盘可以插到我们的电脑上呢,他们定义了一个规则,规定了usb接口的结构大小,这样,无论是哪个厂家生产的U盘,都必须按照这个规则生产,这就是接口的定义。
接口,在表面上是由几个没有主体代码的方法定义组成的集合体,有唯一的名称,可以被类或其他接口所实现(或者也可以说继承)。它在形式上可能是如下的样子:

public interface IAnimal
{
	void Eat();
	void Shut();
}

如上图,我们定义了一个动物的接口,它有吃和叫两种方法,那么如果我们再声明一个类,继承这个IAnimal接口,那么就必须实现这两个方法

public class Dog : IAnimal
    {

        public void Eat()
        {
            Console.WriteLine("dog 吃肉");
        }

        public void Shut()
        {
            Console.WriteLine("dog 汪汪汪");
        }
    }

由此我们可以知道,接口定义了一组规则,它规定了继承接口的类或接口必须实现它所定义的规则,即接口的方法。也就是“如果你是。。。,那么必须能。。。”。同时,它还是同类型事物的抽象体现。比如上文的例子,dog是animal的一种,pig也是animal的一种,他们都有eat,和shut的方法。
二.抽象类
类是一个具有相同特征和行为的抽象,而抽象类(class 前加上 abstract)没有指出行为的具体细节,而由他的子类去实现相应的行为。
注意:一个非密封类(密封类使用 sealed 修饰)可以派生子类,子类可以是抽象类或非抽象类。
代码示例:

public abstract class Father
    {
        /// <summary>
        /// 抽象类中可以有抽象方法
        /// </summary>
        public abstract void Sleep();
        /// <summary>
        /// 也可以有非抽象方法
        /// </summary>
        public void Play()
        {

        }
    }
    /// <summary>
    /// 抽象类可以不实现父抽象类的抽象方法,可以有自己的抽象方法
    /// </summary>
    public abstract class Son:Father 
    {
        public abstract void Study();

    }
    /// <summary>
    /// 非抽象类继承自抽象类 Son,必须实现(需要加上重写关键字:override ) Son 及son的父类的所有抽象方法
    /// </summary>
    public class GrandSon : Son
    {
        public override void Sleep()
        {
            throw new NotImplementedException();
        }
        public override void Study()
        {
            throw new NotImplementedException();
        }
    }

三.虚方法
•用virtual修饰的方法叫做虚方法
•虚方法可以在子类中通过override关键字来重写
•常见的虚方法:ToString() Equals
代码示例如下

public class People
    {
        public virtual void hello ()
        {

            Console.WriteLine("基类方法");
        }
    }
    public class Student : People
    {
        public override void hello()
        {
            Console.WriteLine("子类方法重写");
        }
    }

虚方法与抽象方法最大的区别:虚方法要有方法体,而抽象方法不允许有方法体。
四.接口和抽象类的区别
抽象类和接口的区别:

1、抽象类中可以有实现成员(非抽象方法),而接口中的方法只有声明没有实现;

2、抽象类中可以有字段,接口中不能有字段,但可以有属性;

3、抽象类的成员可以使用公有或其他修饰符,接口中成员是隐式公有的,不需要修饰;

4、抽象类是概念的抽象,接口注重行为,抽象类不支持多重继承,而一个类可以实现多个接口。

猜你喜欢

转载自blog.csdn.net/weixin_39714231/article/details/88951068
今日推荐