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)
答案 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):
类成员和结构成员的访问级别,包括 嵌套类和结构,默认是私有的。
正如您在代码中看到的那样,Arrow
有public virtual void StopArrow
但ExplosiveArrow
有override void StopArrow
,默认情况下与private override void StopArrow
相同。
因此,如果在父类中将元素声明为public
,则无法降低该变量/方法的可见性。如果您不想公开元素,但仍希望能够在派生类中访问,则应使用protected
。
答案 2 :(得分:0)
假设您只发布了代码,此base.StopArrow();
也会出错。
基类箭头
中不存在StopArrow()
你需要base.StopArrow(p);
。