c# 中abstract、sealed、virtual、override、interface、new的回眸系列1

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/uianqian/article/details/100737650

工作多年后回顾一下基础知识,温故而知新。为什么要温故呢?主要原因在于经过多年的代码锤炼之后发现这些脱裤子放屁的东西真的很优秀,必须实实在在的去了解一下,为了往更加优秀的队伍靠拢,就得多写一些脱裤子放屁的代码。

言归正传,了解这些关键字之后在于做底层代码会有很大的好处,下面进入正题。

目录

    1、abstract关键字解读

abstract(抽象)修饰符--指所修饰的内容缺少实现或未完全实现,可用于类、方法、属性、索引器和事件;

  (1)抽象类具有以下特性:

  • 1)抽象类不能实例化,但可以有实例构造函数(即使不提供构造函数, 编译器也会提供默认构造函数);
  • 2)抽象类可以包含实例化方法、抽象方法和抽象访问器;
  • 3)不能用 sealed (密封、不可被继承)修饰符修饰抽象类;
  • 4)从抽象类派生的非抽象类必须实现所有的抽象成员
  • 5)抽象类不可定义抽象字段,可以定义字段(abstract不可用于字段);
  • 6)抽象类可以继承自抽象类,不必全部实现抽象方法
  • 7)抽象类可以继承自非抽象类、接口(可实现部分接口方法,也可全部不实现接口方法)
  • 8)不可以使用virtual、static、sealed进行修饰抽象类
  • 9)抽象类中不必非得包含抽象方法,此时向抽象类中添加的方法只能是静态方法
  • 10)抽象类不能使用new关键字

  (2)抽象方法具有以下特性:

  • 1) 抽象方法是隐式的虚方法;
  • 2) 只能在抽象类中声明使用抽象方法;
  • 3)抽象方法没有方法体,以一个分号结束申明;
  • 4)使用override修饰的覆盖方法提供实现,且只能作为非抽象类的成员;
  • 5)不可以使用virtual、static进行修饰abstract方法
  • 6)抽象方法中必须使用public修饰符

   (3)抽象属性与抽象方法基本相同

  • 1)不能在静态属性上应用abstract修饰符;
  • 2)非抽象的派生类中覆盖重写抽象属性,使用override进行修饰;
interface IA 
{ 
    void FunA(); 
    void FunB(); 
} 

abstract class TestA: IA 
{ 
    protected int _x = 100; //抽象类可以定义字段,但不可以是抽象字段
    public static int fieldsa = 0;
    private int fielda; 
    public abstract int X { get; } //抽象属性
    public abstract string IdxString { get; set; } //抽象属性
    public abstract char this[int i] { get; } //抽象索引器 

    public TestA(int i) //可以定义实例构造函数,仅供派生的非抽象类调用; 
    { 
        fielda = i; 
    }
    public abstract void FunA(); 
    public abstract void FunB(); 
    public abstract void FunC();
} 
 

class TestB: TestA
{ 
    private string idxstring; 
    private int fieldb; 
    //如果基类中没有定义无参构造函数,但存在有参数的构造函数, 
    //那么这里派生类得构造函数必须调用基类的有参数构造函数,否则编译出错 
    public TestB(int p) : base(p)  
    { 
        fieldb = p; 
    } 
    public override string IdxString //覆盖重新属性 
    { 
        get { return idxstring; } 
        set { idxstring = value; } 
    } 
    public override char this[int i] //覆盖重写索引器 
    { 
        get { return IdxString[i]; } 
    } 
    public override int X // 覆盖重写属性
    {
         get { return _x + 10; }
    }
    public void FunA(){ 
        //省略内容
    }
    public void FunB(){
        //省略内容
    }
    public void FunC(){
        //省略内容 
    }
}

 abstract class与interface区别

 相同点:

  • 1、都可以被继承
  • 2、都不能被实例化
  • 3、都可以包含方法声明
  • 4、派生类必须实现未实现的方法

 区别:

扫描二维码关注公众号,回复: 7618632 查看本文章
  • 1、接口不能包含字段和方法实现 ,都可以包含属性、索引器、事件、方法申明;
  • 2、接口是一个行为规范,抽象类可以理解为不完整的类,可实现公共的方法; 
  • 3、接口可以被多重实现,抽象类只能被单一继承;
  • 4、抽象类是抽象内部共性,接口是反映事物的外部特性; 
  • 5、接口可以用于支持回调,而继承并不具备这个特点

使用场景:

 抽象类:主要用于关系密切的对象,抽象出内部共有特性,适合大的功能单元。如果预计要创建组件的多个版本,在组件的所有实现间提供通用的已实现功能,则创建抽象类。抽象类优势:在抽象基类中可以为部分方法提供默认的实现,从而避免在子类中重复实现它们,提高代码的可重用性

 接口:主要用于提供通用的功能,设计小而简练的模块,具有专一功能性的,而不是多功能的

猜你喜欢

转载自blog.csdn.net/uianqian/article/details/100737650
今日推荐