创建具有相同变量但具有不同访问方法的两个类的最佳方法

时间:2020-07-31 18:46:35

标签: c# class oop unity3d inheritance

我知道,通过扩展类,您可以创建一个子类,该子类可以访问其父代的所有变量和方法。但是,我试图实现的是一类具有许多必需变量的类,这些变量都可以在编辑器窗口中进行编辑。另一个具有所有相同的变量,但其中一些不可编辑,而是具有默认值。

我的具体示例是一个具有许多公共变量的对话类:

public class Dialogue : MonoBehaviour
{
    // Public variables for determining whether the dialogue has automatic or manual triggering; and whether it's single use
    public bool isAutomatic, isSingleUse;

    // Public variables for determining whether an unlocked discovery is required in order to trigger the dialogue at all
    public bool requiresDiscovery;
    public string requiresDiscoveryType;
    public int requiresDiscoveryId;

    // Public lists for general conversations and default topic sentences
    public List<Conversation> generalConversations;
    public List<Sentence> defaultTopicSentences;

    // Public variable for holding the optional topics in our conversation (can be left empty if desired)
    public List<Topic> topics;

    /* Methods here... */

}

以上类在Dialogue事件和Cutscene事件中都可以使用(其中可以包含角色移动和其他更复杂内容的多个对话)。它非常适合对话事件,但是我可以创建一个变量类,其中某些变量(例如isAutomatic,isSingleUse,requiresDiscovery等)会自动设置为false,而没有在编辑器中更改它们的选项。这是因为某些变量与过场事件无关,如果设置为true,可能会引起问题。

我遇到的问题是我是否可以将Dialogue用作父级,并以某种方式覆盖子类中某些变量的公共访问;或者如果还有另一种方法必须这样做。如果有人可以给我一个如何实现上述目标的代码示例,那将真的很有帮助。

谢谢。

1 个答案:

答案 0 :(得分:0)

带有继承关系,否则您将要么在两个类中得到具有相同属性的代码重复,要么尝试将单个类合在一起用于两种用途,这与SRP背道而驰。将它们分开可以使您的生活更加轻松。

这样做,您将能够在一个过场动画中拥有多个Dialogue类,但是仍然在过场动画本身中具有Dialogue的功能。

创建一个名为Cutscene的新类,并设置创建Dialogue的新实例时所需的任何Cutscene变量。

public class Cutscene : Dialogue
{
     // Set whatever you need to false to prevent any issues
     public Cutscene() {
          this.isAutomatic = false;
          this.isSingleUse = false;
          this.requiresDiscovery = false
          // etc...
     }
}

如果您想了解有关继承的更多信息,请MSDN has a great page on it