C#如何用参数覆盖函数

时间:2017-07-24 13:16:32

标签: unity3d c#-4.0

public class Arrow : MonoBehaviour {

    public virtual void StopArrow(Transform p){
        arrowRotation = transform.rotation;
        isRelease = false;
        rb.velocity = new Vector3(0, 0, 0);
        transform.SetParent(p);
        transform.rotation = arrowRotation;
    }
}

public class ExplosiveArrow : Arrow {
    override void StopArrow(Transform p){
        base.StopArrow();
    }
}

这给了我这个错误:

  

Assets / Script / ExplosiveArrow.cs(33,23):错误CS0621:   `ExplosiveArrow.StopArrow(Transform)&#39 ;:虚拟或抽象成员   不能私下

  

Assets / Script / ExplosiveArrow.cs(33,23):错误CS0507:   ExplosiveArrow.StopArrow(UnityEngine.Transform):无法改变   覆盖public继承成员时的访问修饰符   Arrow.StopArrow(UnityEngine.Transform)

3 个答案:

答案 0 :(得分:2)

将您的子课程中的override void StopArrow(Transform p){更改为public override void StopArrow(Transform p){即可。

与C ++不同,如果在父类中将其覆盖为private,则无法将覆盖方法的访问权限更改为public

答案 1 :(得分:0)

在C#中如果你没有在类中声明变量和方法的访问修饰符,默认情况下它们将是private

根据Access Modifiers (C# Programming Guide)

  

类成员和结构成员的访问级别,包括   嵌套类和结构,默认是私有的。

正如您在代码中看到的那样,Arrowpublic virtual void StopArrowExplosiveArrowoverride void StopArrow,默认情况下与private override void StopArrow相同。

因此,如果在父类中将元素声明为public,则无法降低该变量/方法的可见性。如果您不想公开元素,但仍希望能够在派生类中访问,则应使用protected

答案 2 :(得分:0)

也...

假设您只发布了代码,此base.StopArrow();也会出错。

  

基类箭头

中不存在StopArrow()

你需要base.StopArrow(p);