C#类型总结

一、抽象(abstract)

 只有类(class)才可以抽象,结构体(struct)不能 ,抽象类不能实例化

class Program
{
    abstract class People
    {
    }

    static void Main(string[] args)
    {
        People people = new People();  //错误写法
    }
}

报错提示:CS0144    无法创建抽象类或接口“Program.People”的实例


//错误案例
abstract class People
{
    abstract void Get();
}

 报错提示:CS0621    '“Program.People.Get()”: 虚拟成员或抽象成员不能是私有的 


abstract class People
{
    internal abstract void Get() { }   //报错
}

  报错提示:CS0500    '“Program.People.Get()”无法声明主体,因为它标记为 abstract


abstract class People
{
    internal abstract void Get();

    protected abstract int Age { get; set; }

    public abstract int this[int index] { get; set; }

    public abstract event Action ChangeEvent;
}

class Man : People
{
    internal override void Get() { }

    protected override int Age { get; set; }

    public override int this[int index]
    {
        get { return Age; }
        set { Age = value; }
    }

    public override event Action ChangeEvent;
}

 总结:

  1. 抽象只针对于 class,struct不能抽象
  2. 抽象成员只能存在于抽象类中(抽象类中的成员也可以不是抽象的)
  3. 可以抽象的成员有(方法、属性、索引器、事件),字段不能抽象
  4. 抽象成员必须标记为可以被子类访问的修饰(public、internal 或protected)
  5. 子类重写抽象父类中的成员时访问修饰符要一致
  6. 标记为抽象的成员是不能有实体的

 二、虚拟(virtual)

//错误案例
class People
{
    virtual void Get() { }
}

 报错提示:CS0621    '“Program.People.Get()”: 虚拟成员或抽象成员不能是私有的  


class People
{
    public virtual void Get() { }

    protected virtual int Age { get; set; }

    public virtual int this[int index]
    {
        get { return Age; }
        set { Age = value; }
    }

    public virtual event Action ChangeEvent;
}

class Man : People
{
    public override void Get() { }

    protected override int Age { get; set; }

    public override int this[int index]
    {
        get { return Age; }
        set { Age = value; }
    }

    public override event Action ChangeEvent;
}

 virtual 与 abstract 的异同点

 相同点:

  1. 都可以修饰的成员有(方法、属性、索引器、事件),字段不行
  2. 成员都必须标记为可以被子类访问的修饰(public、internal 或protected)
  3. 子类重写父类中的成员时访问修饰符要一致
  4. 子类中需重写的成员都要标记为 override

 不同点:

  1. abstract可以修饰于class,但virtual不行(只能修饰于成员)
  2. abstract只能存在于抽象类中,virtual抽象类和不是抽象的类都可以 
  3. abstract修饰的成员不能有实体,但virtual必须有实体
  4. 在子类中,abstract成员必须重写,virtual可以不重写

三、密封(sealed) 

class A { }
sealed class B : A { }
class C : B { }

 报错提示:CS0509    “C”: 无法从密封类型“B”派生

class A
{
    protected virtual void Get() { }
    protected virtual void Set() { }
}
class B : A
{
    protected sealed override void Get() { }
    protected override void Set() { }
}

class C : B
{
    protected override void Set() { }
    protected override void Get() { }
}

 报错提示: CS0239    “C.Get()”: 继承成员“B.Get()”是密封的,无法进行重写 

总结:

  1. 应用于某个类时,sealed 修饰符可阻止其他类继承自该类 
  2. 对替代基类中的虚方法或属性的方法或属性使用 sealed 修饰符, 防止派生类替代特定虚方法或属性
  3. 将 abstract 修饰符与密封类结合使用是错误的,因为抽象类必须由提供抽象方法或属性的实现的类来继承
  4. 应用于方法或属性时,sealed 修饰符必须始终与 override 结合使用

四、接口(interface) 

//错误案例
interface IPeople
{
    public void Get();
}

 报错提示:CS8703    在 C# 7.3 中,修饰符 "public" 对此项无效。


interface IPeople
{
    void Get();
}

class Man: IPeople
{
    void Get() { }  //错误
}

 报错提示:CS0737    '“Program.Man”不实现接口成员“Program.IPeople.Get()”。“Program.Man.Get()”无法实现接口成员,因为它不是公共的。


interface IPeople
{
    void Get();

    int Age { get; set; }

    int this[int index] { get; set; }

    event Action ChangeEvent;
}

class Man : IPeople
{
    public void Get() { }

    public int Age { get; set; }

    public int this[int index]
    {
        get { return Age; }
        set { Age = value; }
    }

    public event Action ChangeEvent;
}

 总结:

  1. interface命名一般以(I)开头
  2. 接口可以包含的成员有(方法、属性、索引器、事件),字段不行
  3. 接口中的成员不能有访问修饰符
  4. 接口中的成员不能实现实体
  5. 子类必须实现所有接口的成员
  6. 子类中接口成员都必须标记为public(不能带override)

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bridge_go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值