2015-04-26 67 views
-2

我开始为年底的项目编写一个Person类,我从以前的项目中找到了一个基本的getset属性,但是它在UML注释中说该方法当前没有保护。设置方法不受保护,我如何保护它?

将“public”更改为“Protected”会很简单吗?或者我错过了什么?

//PROPERTIES 

    /// <summary> 
    /// Property for "Title" 
    /// Read & Write property for attribute "Title" 
    /// set method currently has no protection 
    /// </summary> 
    /// 
    public string Title 
    { 
     get { return title; } 
     set { title = value; } 
    } 

    public string FirstName 
    { 
     get { return firstname; } 
     set { firstname = value; } 
    } 

    public string MiddleName 
    { 
     get { return middlename; } 
     set { middlename = value; } 
    } 

    public string LastName 
    { 
     get { return lastname; } 
     set { lastname = value; } 
    } 

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

"protected set {title = value; }"

正是我一直在寻找。

+5

这取决于撰写该评论的人的“保护”的*定义*。它是否具有*无效输入*,*无效使用*或*其他*的保护功能?如果他们希望'set'方法不能在课堂外使用,请使用'protected set'。 –

+0

你能发布全班吗?我想我知道他们希望你做什么,但我需要看完全班才能确认。 –

+1

我在代码中编辑了问题的文本并删除了指向图片的链接。您将来应该使用文本来表示代码而不是屏幕截图。谢谢! – jdphenix

回答

1

在C#中,你可以有getter和setter方法不同的保护:

public class Person 
{ 
    public string Name { get; protected set; } 
} 

这将允许任何类读取名称,但唯一的人或衍生工具来写。这里我使用了一个自动属性,但是类似的构造可以用于后台字段。

+4

从问题来看,OP是否指字面上的“受保护”属性或其他一些概念并不明确。 – jdphenix

+0

不知道你可以单独给保护一个get/set,谢谢你! –

+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; 
    } 
} 
+0

值==如果value为null,title将抛出一个NullReferenceException。等于(价值,标题)通常是更好的财产平等模式。 – Holstebroe

+0

@Holstebroe - 不,它不会扔,试试吧。并不是更好,Equals()是非常非常少需要的,但是现在每个人都在用它来污染他们所有的代码。一直使用它会使其失去信号功能。 –

+0

你说得对。只有operator ==被重载时,==才会抛出异常而不是字符串。 – Holstebroe

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。它的用例是当你有一个用于继承的类时。如果您在数据模型中代表人员,则不想使用它。

在您的意见中,你声明你想从一个Person派生一个类Address。这是一种不适当的关系。考虑这个简单的英语句子。

地址也是一个人。

废话吧?这个怎么样:

一个人有一个地址。

更有意义。 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也是不可变的。