更改类外的类属性

时间:2012-03-04 23:09:03

标签: c# encapsulation

我有一个公共课

 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;

    }

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

2 个答案:

答案 0 :(得分:2)

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

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

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

或者,如果您希望从调查问卷派生的类能够设置protected set;,则可能需要使用OutputFile

答案 1 :(得分:1)

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

此外,您可以使用允许您指定属性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; }
    ...
}