【发布时间】:2022-01-23 02:52:12
【问题描述】:
我是编程新手,我试图防止 Program 类覆盖由 Person 类的构造函数初始化的属性值
这是我的代码:请参阅 cmets 突出显示我想要实现的目标
using System;
namespace Test
{
class Program
{
class Person
{
public string FName { get; set; }
public string LName { get; set; }
public Person(string fName, string lName)
{
FName = fName;
LName = lName;
}
public override string ToString()
{
return FName + " " + LName;
}
}
static void Main()
{
Person person = new Person("Adam", "Lake");
person.FName = "Fabio"; // I want to prevent this
person.LName = "Scagliola"; // I want to prevent this
Console.WriteLine(person);
}
}
}
【问题讨论】:
-
因此,您正在通过执行覆盖主动导致问题;你打算创建两个 Person 对象吗?或者从字面上看,您是否想知道如何将属性设为 ReadOnly,这样当您这样做时,您会看到一个编译器错误,即 Steve/Stoogie 行是不可能的(我想知道问题是什么;您不知道如何制作两个人或您不知道如何将属性设置为只读)
-
@CaiusJard - 是的,这个想法是在尝试运行 Steve Stoogie 行时抛出编译错误,因为它不应该存在,它应该只显示 Adam Lake。如果使用了 Adam Lake 以外的任何名称,我需要一个编译错误来阻止程序运行。我想我现在可能已经对它进行了排序:)
-
实现目标的最简单、最快的方法是保护二传手:
public string FirstName { get; protected set; } public string LastName { get; protected set; } -
@FabioScagliola 我不同意。如果另一个类派生自
Person怎么办?您仍然可以更改该属性,而不是用户想要的。 -
@zaggler,我相信 Adam 正在尝试封装名字和姓氏,以防止
Program类覆盖它们。如果是这样,我提出的解决方案将起作用。不过,我同意你的看法:这不会阻止派生类覆盖名字和姓氏。无论如何,我正在尝试改进这个问题并请求考虑重新打开它,因为 封装 主题很有趣
标签: c# encapsulation