C#知识点(5)接口、抽象类

接口

  1. 接口:一种约束,实现接口的类或者结构必须遵守该约定。
  2. 声明:用interface 关键字声明。接口能声明方法、属性、索引器和事件,但是不能实现它们。
  3. 泛型接口和非泛型接口:
    泛型接口演示,泛型接口可以让方法普适性更强。
    interface ICompare<T>
    {
        bool Compare(T obj);
    }
    public class Student : ICompare<Student>
    {
        public int marks;
        public string name;
        public bool Compare(Student stu)
        {
            return this.marks > stu.marks;
        }
    }
  1. 接口的显式实现和隐式实现:
    接口的隐式实现:实现接口的方法直接写名称。接口和类都可以访问。
namespace Blog1
{
    interface ITest
    {
        void Test();
    }
    public class One : ITest
    {
        public void Test()
        {
            Console.WriteLine("这只是一个测试");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //隐示实现:接口和类都可以访问
            ITest a = new One();
            a.Test();
            One b = new One();
            b.Test();
            Console.ReadKey();
        }
    }
}
/*输出:
这只是一个测试
这只是一个测试
 */

接口的显式实现:实现接口的方法用“接口.方法名字”,只有接口可以访问。

namespace Blog1
{
    interface ITest
    {
        void Test();
    }
    public class One : ITest
    {
        public void ITest.Test()
        {
            Console.WriteLine("这只是一个测试");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            //显示实现:只有接口可以访问
            ITest a = new One();
            a.Test();
            One b = new One();
            Console.ReadKey();
        }
    }
}
/*输出:
这只是一个测试
 */

区别:

  • 隐示实现:接口和类都可以访问
  • 显示实现:只有接口可以访问

显示实现的好处:

  • 隐藏代码的实现
  • 在使用接口访问的系统中,调用者只能通过接口调用而不是底层的类来访问
  1. 注意:
  • 接口方法名字通常接口命令以 I 字母开头。
  • 接口声明默认是 public 的。
  • 接口的成员是隐式public的,不允许有任何访问修饰符,包括public。
  • 接口声明可以用六个访问级别声明,但是在命名空间里面声音只能public。
  • 牛客做了一道题,答案是接口可以声明方法、属性、索引器和事件。但是属性、索引器和事件的实质都是方法:属性实质是由{get;set;}两个方法组成;索引器其实就是一个属性;事件本身即为方法。
    interface ITest<T>
    {
        //属性
        int Num
        {
            get;
            set;
        }
        //索引器
        string this[int index]
        {
            get;
            set;
        }
        //事件
        event EventHandler TestEvent;
        //泛型
        bool Test(T obj);
    }

抽象类

  1. 抽象类:通过在类定义前面放置关键字 abstract,可以将类声明为抽象类。
  2. 声明:用abstract关键字声明。抽象类里可以包含两种抽象成员,分别是抽象方法声明和抽象属性,同时可以包含其他非抽象成员。
    public abstract class BallGame
    {
        //属性
        public abstract string  name { get; }
        //方法
        public abstract void GetGround();
    }
    public class Basketball : BallGame
    {
        public override string name
        {
            get
            {
                return "篮球";
            }
        }
        public override void GetGround()
        {
            Console.WriteLine("篮球场");
        }
    }
  1. 注意:
  • 抽象类不能实例化。 抽象类的用途是提供一个可供多个派生类共享的通用基类定义。
  • 抽象类的派生类必须实现所有抽象方法。
  • 当抽象类从基类继承虚方法时,抽象类可以使用抽象方法重写该虚方法。继承抽象方法的类无法访问方法的原始实现。

接口和抽象类的同异

同:

  1. Sealed都不能修饰接口和抽象类。
  2. 都体现了多态性。
  3. 抽象类的抽象方法、属性、接口的方法都需要靠继承来实现。

异:

  1. 接口可以多重继承,而抽象类只能单一继承。
  2. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,不过可以修改为虚方法。
  3. 抽象基类可以定义字段、属性、方法实现。接口只能定义属性、索引器、事件、和方法声明,不能包含字段(成员变量)。
  4. 接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。
  5. 接口着重于Can—Do关系类型,抽象类则偏重于IS—A式关系。
  6. 接口可以作用于值类型和引用类型,抽象类只能作用于引用类型。关于接口可以作用于值类型,struct是值类型,只可以继承接口。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值