更改类外的类属性

本文关键字:属性 | 更新日期: 2023-09-27 18:26:43

我有一个公共类

 public class Interview
{
    public int InterviewId;
    public string ApplicantName;
    ...
    public List<AnsweredQuestions> AnsweredQuestions;
    public Questionnaire questionnaire;
}

并将其用于像这样的主程序:

 Interview interview = new Interview();
 interview.InterviewId = 1;

和一个问卷类

public class Questionnaire
{
    public int questionnaireId;
    public string outputFile;
    ...
}

如何防止修改主程序中的属性:

interview.questionnaire.outputFile

我发现我可以在主程序中使用DocumentManager类,如下所示:

interview = documentManager.GetInterviewSession();
interview.questionnaire = documentManager.GetQuestionnaireManagement();
interview.AnsweredQuestions = documentManager.GetInterviewAnsweredQuestions();

通过使用这个

public class DocumentManager
{
    private readonly Interview _interview;

public DocumentManager(Interview interview)
    {
        _interview = interview;
    }

我确信我应该封装,但我不确定如何封装。如有任何帮助,我们将不胜感激。谢谢

更改类外的类属性

我不确定我是否完全理解这个问题,但这是只读封装的常用方法:

public class Questionnaire
{
    public string OutputFile { get; private set; }
}

这将创建一个名为OutputFile的属性,该属性可以公开读取,但只能由Questionnaire类写入。

或者,如果希望从Questionnaire派生的类能够设置OutputFile,则可以使用protected set;

如果您需要某些属性是不可变的,那么您可以在类的构造函数中提供这些属性。

此外,您可以使用允许您指定属性getter和setter是否为private/public/internal/protected的属性,而不是使用字段。

在您的示例中,您可以将InterviewId作为具有公共get访问器和仅私有set访问器的属性。这意味着只有类本身才能设置interviewId。如果设置interviewId的唯一方法是在类的构造函数处,那么消费代码就没有办法更改它(当然除了使用反射)

public class Questionnaire
{
    public Questionnaire(int questionnaireId, string outputFile)
    {
         QuestionnaireId = questionnaireId;
         OutputFile = outputFile
    } 
    public int QuestionnaireId {get; private set;} 
    public string OutputFile { get; private set; }
    ...
}