Set Method不受保护,如何保护?

时间:2015-04-26 19:19:27

标签: c# class oop

我开始为年终项目写一个Person类,我从之前的项目中找到了一个基本的getset属性,但它在UML注释中表示该方法目前没有保护。

将“公共”改为“受保护”是否简单?或者我错过了什么?

"protected set {title = value; }"

PS。我是一个基本的OOP课程,它是非常简单的代码(我的项目只需要一个属性:P),我以前从未在get / set中使用过验证,我会调查它,但我认为:

@IBOutlet weak var moveConstant: NSLayoutConstraint!

正是我所寻找的。

3 个答案:

答案 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实例之外的代码不能改变地址*,而PersonAddress,这在此上下文中是有意义的。

*这是正确的,因为HomeAddress引用从外部是不可变的,但它引用的Address对象不是。为了避免混淆和以后的FUBAR,请确保Address也是不可变的。