2017-07-24 75 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);有代替。