C# abstract override 修饰符

定义:

abstract 修饰符指示被修改内容的实现已丢失或不完整。 abstract 修饰符可用于类、方法、属性、索引和事件。 在类声明中使用 abstract 修饰符以指示某个类仅旨在作为其他类的基类。 标记为 abstract 的成员,或包含在抽象类中的成员,都必须由派生自抽象类的类来实现。

 

功能:

抽象类具有以下功能:

  • 抽象类不能实例化。

  • 抽象类可能包含抽象方法和访问器。

  • 无法使用 sealed 修饰符来修改抽象类,因为两个修饰符具有相反的含义。 sealed 修饰符阻止类被继承,而 abstract 修饰符要求类被继承。

  • 派生自抽象类的非抽象类,必须包含全部已继承的抽象方法和访问器的实际实现。

在方法或属性声明中使用 abstract 修饰符,以指示该方法或属性不包含实现。

 

抽象方法具有以下功能:

  • 抽象方法是隐式的虚拟方法。

  • 只有抽象类中才允许抽象方法声明。

  • 由于抽象方法声明不提供实际的实现,因此没有方法主体;方法声明仅以分号结尾,且签名后没有大括号 ({ })

  • 通过包含使用 override 修饰符的属性声明,可在派生类中重写抽象继承属性 

附:1.在静态属性,方法上使用 abstract 修饰符是错误的

       2.在抽象方法声明中使用 static 或 virtual 修饰符是错误的

 

例子

在游戏中特效一般是很常见的,一般特效也会分很多种,比如不同的子弹打击需要呈现不同的效果

1.创建特效基类

public abstract class Effect : MonoBehaviour {

    private int id;
    public static int Id = 0;
    public abstract int X { get; } //抽象属性 
    public abstract string IdxString { get; set; } //抽象属性 
    public abstract char this[int i] { get; } //抽象索引器 

    public abstract void Init(params object[] args);// 抽象方法 

    /// <summary>
    /// 创建特效
    /// </summary>
    /// <param name="efxName"></param>
    /// <param name="args"></param>
    /// <returns></returns>
    public static Effect Create(string eftName, params object[] args) {
        GameObject go = Spawn(eftName);
        Effect eft = go?.GetComponent<Effect>();
        eft?.Init(args);
        return eft;
    }

    public static GameObject Spawn(string efxName) {
        //TODO 获取特效对象
        //return ObjectPool.instance.GetObjectFromPool(efxName);
        return null;
    }

    public static void UnSpawn(GameObject go) {
        //TODO 回收特效
        //ObjectPool.instance.ReturnObjectToPool(go);
    }
}

2.创建加农炮弹特效子类

public sealed class CannonEft : Effect {

    private string skillId;
    private bool otherTurretHit;
    private int bulletId;
    private float range;
    private int userId;

    private string idxString;
    private int id;
    private int x;

    public override char this[int i] => IdxString[i];

    public override int X {
        get {
            return x;
        }
    }

    public override string IdxString {
        get 
            { return idxString; }
        set 
            { idxString = value; }
    }

    /// <summary>
    /// 初始化
    /// </summary>
    /// <param name="args">参数数组</param>
    public override void Init(params object[] args) {
        this.skillId = (string)args[1];
        this.otherTurretHit = (bool)args[2];
        this.bulletId = (int)args[3];
        this.range = (float)args[4];
        this.userId = (int)args[5];

        //TODO 调用其他的一些操作
        Debug.Log("Effect Init");

        //回收
        this.Invoke("Recycle", 1f);
    }

    public void DebugLog() {
        print("CannonEft func");
    }

    private void Recycle() {
        Effect.UnSpawn(this.gameObject);
    }
}

3.测试脚本

    private string skillId="skill_Cannon";
    private bool otherTurretHit = false;
    private int bulletId=0;
    private float range=5;
    private int userId=1001;
   
    void Start () {
        CannonEft eft= (CannonEft)Effect.Create("特效名称", skillId, otherTurretHit, bulletId, range, userId);
        eft.DebugLog();
	}

解析:

在基类Effect中定义

    public abstract int X { get; } //抽象属性 
    public abstract string IdxString { get; set; } //抽象属性 
    public abstract char this[int i] { get; } //抽象索引器 

    public abstract void Init(params object[] args);// 抽象方法 

必须在子类CannonEft中override重写,不然报错

 

调用时很简单:Effect.Create("特效名称", skillId, otherTurretHit, bulletId, range, userId)

参数传递是object[]

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值