【问题标题】:Handling a null object in a derived class c# unity处理派生类中的空对象 c# unity
【发布时间】:2018-02-09 20:46:14
【问题描述】:

我有一个名为 BaseWeather 的基类,每个天气状态都派生自这个基类

现在BaseWeather 包含public ParticleSystem _ParticleSystem; 因为大多数天气状态可以有1个或多个粒子系统(Thunderstorm->Rain->Lighting->Tornado)

现在,当谈到晴天的天气状态时,没有粒子系统,因为“晴天”是由光和雾处理的,所以在我的派生类 Sunny 中,我这样做是为了纠正这样一个事实:是一个零粒子系统

try{
            base.ResetEmission();
        }catch{
            if (WeatherSystem.Instance._debugState == DebugLevel.Full) {
                Debug.LogWarning ("Particle System is null at Sunny.cs line 47");
            }
        }

我的逻辑是使用 try 块并发现 ResetEmission() dosent 工作它只会假定它的 null 调试警告并且它不会影响游戏玩法

我的问题是处理这种情况的“正确”方法是什么

【问题讨论】:

  • 你的设计违反了里氏替换原则。如果 SunnyWeather 类没有粒子系统,则粒子系统属性不应位于 BaseWeather 类中。考虑创建另一个继承自 BaseWeather 的类,称为 ParticleWeather 或类似的东西。然后您的具有粒子系统的类从该类继承(继而继承 BaseWeather)。
  • 除了我的回答之外,我建议不要将异常用作逻辑的一部分。应该为真正的异常情况(磁盘空间不足、没有网络、缺少数据库等)保留异常,而不是合理预期的情况。即使在base.ResetEmission 中进行简单的空检查也会更好。
  • 您是否考虑过简单地添加一个if(ParticleSystem == null) return;

标签: c# unity3d


【解决方案1】:

“正确”的方式是以下之一:

  1. 创建另一个基类,例如BaseWeatherWithParticleSystem 并且只有在您确实提供粒子系统时才继承它
  2. 创建一个接口,例如IWeatherParticleSystem 并为需要粒子系统的类实现它。

我倾向于界面方法。它使测试更容易,更清楚地宣传班级的能力。请注意,您可以实现这两种方法,例如:

public class BaseWeather { ... }
public class BaseWeatherWithParticleSystem : BaseWeather, IWeatherParticleSystem { ... }

至于将接口应用于基类或派生类,这取决于您的 IDE 提供的支持级别,以便从类引用中轻松发现已实现的接口。

请注意不要试图通过继承和基类来处理过多的事情。很容易将自己编程到一个角落,试图让一切都适合继承层次结构。我发现你通常最好直接实现一些东西,然后在你设置好基础之后重构通用代码。

正如@maccettura 在他们的评论中指出的那样,“正确”的方式旨在避免违反SOLID 原则。

【讨论】:

    猜你喜欢
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 2012-02-15
    • 1970-01-01
    • 2013-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多