首页 > 解决方案 > 在派生类中设置指向不同字段的属性

问题描述

我想知道是否有办法做到这一点,我不太明白为什么它不起作用。完全公开,这是在 Unity 中,所以它可能会在更高版本的 C# 中解决。

我有课FooFoo有一个字段和属性:

MeshRenderer meshRenderer;
public MeshRenderer Renderer {get {return this.meshRenderer;} set {this.meshRenderer = value;}}

我有一个派生类BarBar有一个字段和属性:

SkinnedMeshRenderer skinnedMeshRenderer;
public SkinnedMeshRenderer Renderer {get {return this.skinnedMeshRenderer;} set {this.skinnedMeshRenderer= value;}}

Foo有一个方法,Remesh()它设置:

this.Renderer.materials = SomeListOfMaterials.ToArray();

Bar,当然继承了这个方法。两者MeshRenderer都有SkinnedMeshRenderer一个公共材料字段,其中包含一系列材料。当我调试代码时,对方法的调用按预期Bar.Remesh()落入该Foo.Remesh()方法,并且this.Renderer.materials按预期有效,并且按预期SomeListOfMaterials是材料列表。但它返回一个空引用异常。

如果我将Remesh()代码逐字复制到Bar(使用 new 修饰符),它可以正常工作。当它下降到 时Foo.Remesh(),我什至检查了这实际上是Bar(它是)。

标签: c#unity3d

解决方案


编辑我想我现在明白了:

在 foo 中 this.Renderer 是 MeshRenderer,在 bar 中 this.Renderer 是 SkinnedMeshRenderer,因此当您从基类调用 Remesh() 时,它会拉动 MeshRenderer,但是当您将 Remesh() 添加到 Bar 时,this.Renderer 会调用 skinnedMeshRenderer。我认为您应该将 Remesh() 方法作为覆盖方法添加到 Bar,因为您现在使用的是 SkinnedMeshRenderer 而不是 MeshRenderer。

this.Renderer.materials = SomeListOfMaterials.ToArray();

编辑第二部分以保持代码清洁

Renderer renderer;
public Renderer Renderer {get {return this.renderer;} set {this.renderer = value;}}

bar 不改变渲染器方法,MeshRenderer 和 SkinnedMeshRenderer 都派生渲染器,所以你应该仍然可以在 foo 中设置一个 MeshRenderer 在 bar 中设置一个 SkinnedMeshRenderer,因此你可以只在 foo 中保留 Remesh() 并且它不会在 bar 中覆盖而有效.


推荐阅读