我开始为年终项目写一个Person类,我从之前的项目中找到了一个基本的getset属性,但它在UML注释中表示该方法目前没有保护。
将“公共”改为“受保护”是否简单?或者我错过了什么?
"protected set {title = value; }"
PS。我是一个基本的OOP课程,它是非常简单的代码(我的项目只需要一个属性:P),我以前从未在get / set中使用过验证,我会调查它,但我认为:
@IBOutlet weak var moveConstant: NSLayoutConstraint!
正是我所寻找的。 p>
答案 0 :(得分:3)
从此
/// set method currently has no protection
public string Title
{
get { return title; }
set { title = value; }
}
我猜这种保护不是关于protected
访问修饰符,而是关于数据验证。
验证可以采用许多不同的形式,一种可能的形式看起来像
public string Title
{
get { return title; }
set
{
if (value == title)
return;
if (string.IsNullOrEmpty(value))
throw new ArgumentException("Title");
title = value;
}
}
答案 1 :(得分:1)
在C#中,你可以对setter和getter有不同的保护:
public class Person
{
public string Name { get; protected set; }
}
这将允许任何类读取Name,但只允许使用Person或衍生物来编写它。这里我使用的是自动属性,但类似的结构可以与支持字段一起使用。
答案 2 :(得分:0)
您希望保护您的班级数据免受来自外部的突变。在OOP用语中,这被称为encapsulation。
请考虑以下代码段:
sealed class Person {
public Person(string name) {
this.name = name;
}
public string Name { get; private set; }
}
Person
的实例不能从外部变异。因为Person
的实例是不可变的。 从上面得出,使用Person
的代码无需担心编辑Person
的风险:
Person p = new Person('Bob');
p.Name = 'Sally' // won't work, set is not accessible
其他说明:
您可能不希望字面protected
。它的用例是当你有一个用于继承的类时。如果您在数据模型中表示人员,则不希望使用它。
在您的评论中,您声明要从Address
派生一个课程Person
。这是一种不恰当的关系。考虑这个简单的英语句子。
地址也是一个人。
胡说八道,对吗?那个怎么样:
一个人有一个地址。
更有意义。 More related reading。
因此,在这个意义上,您将与作曲建立HAS-A
关系 - 地址将是Person
的成员。
sealed class Person {
public Address HomeAddress {get; private set;}
//.. and other members
}
上面再次确定,Person
实例之外的代码不能改变地址*,而Person
有Address
,这在此上下文中是有意义的。
*这是正确的,因为HomeAddress
引用从外部是不可变的,但它引用的Address
对象不是。为了避免混淆和以后的FUBAR,请确保Address
也是不可变的。