C# 在类外更改类属性
我有一门公共课C# 在类外更改类属性,c#,encapsulation,C#,Encapsulation,我有一门公共课 public class Interview { public int InterviewId; public string ApplicantName; ... public List<AnsweredQuestions> AnsweredQuestions; public Questionnaire questionnaire; } 和一个问卷班 public class Questionnaire { pub
public class Interview
{
public int InterviewId;
public string ApplicantName;
...
public List<AnsweredQuestions> AnsweredQuestions;
public Questionnaire questionnaire;
}
和一个问卷班
public class Questionnaire
{
public int questionnaireId;
public string outputFile;
...
}
如何防止修改主程序的属性:
interview.questionnaire.outputFile
我发现我可以在主程序中使用DocumentManager类,如下所示:
Interview interview = new Interview();
interview.InterviewId = 1;
interview = documentManager.GetInterviewSession();
interview.questionnaire = documentManager.GetQuestionnaireManagement();
interview.AnsweredQuestions = documentManager.GetInterviewAnsweredQuestions();
用这个
public class DocumentManager
{
private readonly Interview _interview;
我确定我应该封装,但我不确定如何封装。任何帮助都将不胜感激。
谢谢 我不确定我是否完全理解这个问题,但这是只读封装的常用方法:
public class Questionnaire
{
public string OutputFile { get; private set; }
}
这将创建一个名为OutputFile
的属性,该属性可以公开读取,但只能由问卷调查
类编写
或者,您可能希望使用
保护集
如果您希望从调查问卷派生的类能够设置OutputFile
我不确定我是否完全理解这个问题,但这是只读封装的常用方法:
public class Questionnaire
{
public string OutputFile { get; private set; }
}
这将创建一个名为OutputFile
的属性,该属性可以公开读取,但只能由问卷调查
类编写
或者,您可能希望使用
保护集
如果希望从调查问卷派生的类能够设置OutputFile
如果需要设置某些属性,则可以在类的构造函数中提供这些属性
您还可以使用属性来指示属性getter和setter是否为private/public/internal/protected,而不是使用字段
在您的示例中,您可以将InterviewId作为一个属性,使用公共get访问器和专用set访问器。这意味着只有类本身可以设置interviewId。如果设置interviewId的唯一方法是在类的构造函数中,那么消费代码就没有办法更改它(当然除了使用反射)
如果需要指定某些属性,则可以在类的构造函数中提供这些属性 您还可以使用属性来指示属性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; }
...
}