• 友链

  • 首页

  • 文章归档
h u a n b l o g
h u a n b l o g

欢

HI,Friend

04月
12
C#

抽象类与抽象成员

发表于 2022-04-12 • 字数统计 2520 • 被 1,053 人看爆

抽象类

指设计为被继承的类
抽象类只能作为其它类的基类

规则

  • 不能创建抽象类的实例。
  • 抽象类使用abstract修饰符声明。

例

abstract class MyClass
{
    ....
}
  • 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带实现的成员的任意组合。
  • 抽象类自己可以派生自另一个抽象类。例如,下面的代码展示了一个抽象类,它派生自另一个抽象类。

例

abstract class MyClass
{
    ....
}

abstract class MyAbClass:MyClass
{
    ....
}

  • 任何派生自抽象类的类必须使用override关键字实现该类所有的抽象成员,除非派生类自己也是抽象类。

抽象成员

指设计为被覆写的函数成员

特征

  • 必须是一个函数成员。也就是说,字段和常量不能为抽象成员。
  • 必须用abstract修饰符标记。
  • 不能有实现代码块。抽象成员的代码用分号表示。

语法

abstract public void PrintStuff(string s);
abstract public int MyProperty{
    get;
    set;
}

抽象成员只能在抽象类中声明

方法、属性、事件、索引四个类型成员可以声明为抽象

注意

  • 尽管抽象成员必须在派生类中用相应的成员覆写,但不能把virtual修饰符附加到abstract修饰符。
  • 类似虚成员,派生类中抽象成员的实现必须指定override修饰符。

比较虚成员和抽象成员

比较虚成员和抽象成员.png

实例1

abstract class AbClass
{
    public void IdentifyBase()
    {
        Console.WriteLine("AbClass");
    }

    abstract public void IdentifyDerived();     //抽象方法
}

class DerivedClass : AbClass  //派生类
{
    public override void IdentifyDerived()
    {
        Console.WriteLine("DerivedClass");
    }
}

class Program
{
    static void Main(string[] args)
    {
        DerivedClass b = new DerivedClass();
        b.IdentifyBase();
        b.IdentifyDerived();
        Console.ReadKey();
    }
}

结果

AbClass
DerivedClass

实例2

abstract class MyBase
{
    public int SideLength = 10;
    const int TriangleSideCount = 3;

    abstract public void PrintSuff(string s);
    abstract public int MyInt { get; set; }
    
    public int PerimeterLength()
    {
        return TriangleSideCount * SideLength;
    }
}

class MyClass : MyBase  //派生类
{
    public override void PrintSuff(string s)
    {
        Console.WriteLine($"DerivedClass.PrintSuff:{s}");
    }

    private int _myInt;
    public override int MyInt
    {
        get { return _myInt; }
        set { _myInt = value; }
    }
}

class Program
{
    static void Main(string[] args)
    {
        MyClass mc = new MyClass();
        mc.PrintSuff("this is a string");
        mc.MyInt = 28;
        Console.WriteLine($"mc.MyInt:{mc.MyInt}");
        Console.WriteLine($"mc.PerimeterLength: {mc.PerimeterLength()}");
        Console.ReadKey();
    }
}

结果

DerivedClass.PrintSuff:this is a string
mc.MyInt:28
mc.PerimeterLength: 30

分享到:
结构
访问修饰符
  • 文章目录
  • 站点概览
欢

网红 欢

你能抓到我么?

Email RSS
看爆 Top5
  • mac系统版本与Xcode版本有冲突 4,089次看爆
  • JAVA_HOME环境配置问题 3,739次看爆
  • AssetBundle使用 3,507次看爆
  • VSCode配置C++开发环境 3,262次看爆
  • Lua反射 3,138次看爆

Copyright © 2025 欢 粤ICP备2020105803号-1

由 Halo 强力驱动 · Theme by Sagiri · 站点地图