2017-07-24 43 views
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(); 
    } 
} 

这给了我这个错误:C#如何重写功能与参数

Assets/Script/ExplosiveArrow.cs(33,23): error CS0621: `ExplosiveArrow.StopArrow(Transform)': virtual or abstract members cannot be private

Assets/Script/ExplosiveArrow.cs(33,23): error CS0507: ExplosiveArrow.StopArrow(UnityEngine.Transform) : cannot change access modifiers when overriding public inherited member Arrow.StopArrow(UnityEngine.Transform)

+0

错误说明了所有 - 将'override void StopArrow'改为'public override void StopArrow' – tinamou

回答

2

改变您小孩类override void StopArrow(Transform p){public override void StopArrow(Transform p){就大功告成了。

与C++不同,如果在父类中标记为public,则无法将重写方法的访问更改为private

0

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

根据Access Modifiers (C# Programming Guide)

The access level for class members and struct members, including nested classes and structs, is private by default.

所以你可以在你的代码中看到,Arrowpublic virtual void StopArrowExplosiveArrowoverride void StopArrow默认情况下是一样的private override void StopArrow

所以,如果你在父类中声明一个元素为public,那么你不能减少该变量/方法的可见性。如果你不想暴露一个元素,但你仍然希望能够在派生类中访问,你应该使用protected

0

也...

假设只有你发布的代码,这base.StopArrow();也将错误。

StopArrow() doesn't exist in base class Arrow

你需要base.StopArrow(p);有代替。