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

C# 创建具有相同变量但具有不同访问方法的两个类的最佳方法,c#,class,oop,unity3d,inheritance,C#,Class,Oop,Unity3d,Inheritance,我知道,通过扩展一个类,您可以创建一个子类,该子类可以访问其父类的所有变量和方法。然而,我试图实现的是一个类,其中包含许多必需的变量,这些变量都可以从编辑器窗口进行编辑;另一个变量具有所有这些相同的变量,但有些变量不可编辑,而是具有默认值 我的具体示例是一个对话类,它有许多公共变量: public class Dialogue : MonoBehaviour { // Public variables for determining whether the dialogue has au

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

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

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... */

}
公共课堂对话:单一行为
{
//用于确定对话是自动触发还是手动触发的公共变量;以及是否为一次性使用
公共图书馆是自动的,是单独使用的;
//用于确定是否需要解锁发现才能触发对话的公共变量
公共领域需要发现;
公共字符串requiresDiscoveryType;
公共int要求发现ID;
//一般对话和默认主题句的公共列表
公开列表一般转换;
公开列出默认主题;
//用于保存对话中可选主题的公共变量(如果需要,可以保留为空)
公开主题列表;
/*这里的方法*/
}
上面的类既用于对话事件,也用于剪切场景事件(可以包含角色移动和其他更复杂内容的多个对话)。它非常适合对话事件,但我可以创建一个变体类,其中一些变量(例如isAutomatic、isSingleUse、requiresDiscovery等)会自动设置为false,而不需要在编辑器中更改它们。这是因为某些变量与Cutscene事件无关,如果设置为true,则可能会导致问题

我遇到的问题是,我是否可以将对话用作父类,并以某种方式覆盖子类中某些变量的公共访问;或者如果有其他的方法可以做到这一点。如果有人能给我一个代码示例,说明我如何实现上述目标,那将非常有帮助


提前感谢。

坚持继承,否则您要么在两个类中使用相同属性的代码复制,要么试图将一个类拼凑在一起用于两种用途,这与SRP背道而驰。把它们分开会让你的生活轻松很多

通过这样做,您将能够在一个剪接场景中拥有多个对话类,但仍然具有剪接场景中对话本身的功能

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

公共类剪接场景:对话
{
//将您需要的设置为false以防止出现任何问题
公共剪贴画(){
this.isAutomatic=false;
this.isSingleUse=false;
this.requiresDiscovery=false
//等等。。。
}
}

如果您想了解有关继承的更多信息,

几乎像是一个X/Y问题类型的问题。你似乎违反了单一责任原则。如果你有一门课是关于对话的,一门课是关于剪贴画的,这一点一开始就不是问题。嗯,你可能会在那里学到一些东西。。。你有没有可能建议一个普通的对话父类,然后是一个单独对话事件的子类,以及一个单独的剪接场景的子类?剪接场景是一种什么样的对话类型?您甚至可以声明
可以包含多个带有角色移动和其他更多内容的对话
对不起,我可能没有正确描述情况。我有一个DialogueController,它可以被传递给上面描述的Dialogue类的单个实例。我的剪贴画是由一个CutsceneControl类控制的,该类可以传递许多对话实例,并按顺序在其中运行。CutsceneControl本身在每次运行对话实例(以及执行一系列其他操作)时都会调用DialogueController。所以我的意思是有一个对话的子类直接传递给DialogueController,还有一个单独的子类传递给CutsceneController。你所描述的听起来不错,问题到底是什么?如果两者都具有相同的属性,则将其作为各自的抽象父对象,但其本身不是对话或剪切场景事件。只有在每种情况下应用的公共属性才属于每个子类。