c# - 在派生类中设置指向不同字段的属性
问题描述
我想知道是否有办法做到这一点,我不太明白为什么它不起作用。完全公开,这是在 Unity 中,所以它可能会在更高版本的 C# 中解决。
我有课Foo
。 Foo
有一个字段和属性:
MeshRenderer meshRenderer;
public MeshRenderer Renderer {get {return this.meshRenderer;} set {this.meshRenderer = value;}}
我有一个派生类Bar
。 Bar
有一个字段和属性:
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
(它是)。
解决方案
编辑我想我现在明白了:
在 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 中覆盖而有效.
推荐阅读
- python - 我不想硬编码要打开的文件('Besties.txt')
- sql - 在放慢日常工作的同时
- reactjs - 使用带有订阅部分的部分标记内的 amp-video-iframe 会导致错误
- sql - 从数组中的数组中提取值并将其格式化为行
- go - 如何创建自定义工作流定义?
- python - 如何在浏览器中重定向/渲染 Pyodide 输出?
- android - 看不到进度条
- sql-server - 可以通过pyodbc和SELECT语句访问数据,但是SQL中没有新表出现
- angular - 无法在Angular中读取组件的html文件中的变量
- python - 我似乎无法在循环中偏移迭代器