• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C#教程 > 详解C#中的接口属性以及属性访问器的访问限制

详解C#中的接口属性以及属性访问器的访问限制

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言32关键字详解,c语言链表详解,c语言指针详解,c语言题库及详解答案,c语言关键字详解等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

接口属性
可以在接口上声明属性。以下是接口索引器访问器的示例:

public interface ISampleInterface
{
  // Property declaration:
  string Name
  {
    get;
    set;
  }
}
</div>

接口属性的访问器不具有体。因此,访问器的用途是指示属性是否为读写、只读或只写。
在此例中,接口 IEmployee 具有读写属性 Name 和只读属性 Counter。 Employee 类实现 IEmployee 接口并使用这两种属性。程序读取新雇员的姓名和雇员的当前编号,并显示雇员姓名和计算所得的雇员编号。
可以使用属性的完全限定名,它引用声明成员的接口。例如:

string IEmployee.Name
{
  get { return "Employee Name"; }
  set { }
}
</div>

这称为显式接口实现(C# 编程指南)。例如,如果 Employee 类实现两个接口 ICitizen 和 IEmployee,并且两个接口都具有 Name 属性,则需要显式接口成员实现。即,如下属性声明:

string IEmployee.Name
{
  get { return "Employee Name"; }
  set { }
}
</div>

在 IEmployee 接口上实现 Name 属性,而下面的声明:

string ICitizen.Name
{
  get { return "Citizen Name"; }
  set { }
}
</div>

在 ICitizen 接口上实现 Name 属性。

interface IEmployee
{
  string Name
  {
    get;
    set;
  }

  int Counter
  {
    get;
  }
}

public class Employee : IEmployee
{
  public static int numberOfEmployees;

  private string name;
  public string Name // read-write instance property
  {
    get
    {
      return name;
    }
    set
    {
      name = value;
    }
  }

  private int counter;
  public int Counter // read-only instance property
  {
    get
    {
      return counter;
    }
  }

  public Employee() // constructor
  {
    counter = ++counter + numberOfEmployees;
  }
}

class TestEmployee
{
  static void Main()
  {
    System.Console.Write("Enter number of employees: ");
    Employee.numberOfEmployees = int.Parse(System.Console.ReadLine());

    Employee e1 = new Employee();
    System.Console.Write("Enter the name of the new employee: ");
    e1.Name = System.Console.ReadLine();

    System.Console.WriteLine("The employee information:");
    System.Console.WriteLine("Employee number: {0}", e1.Counter);
    System.Console.WriteLine("Employee name: {0}", e1.Name);
  }
}

</div>

比如这里我们输入:

210
Hazem Abolrous

</div>

则示例输出

Enter number of employees: 210
Enter the name of the new employee: Hazem Abolrous
The employee information:
Employee number: 211
Employee name: Hazem Abolrous
</div>

限制访问器可访问性
属性或索引器的 get 和 set 部分称为“访问器”。默认情况下,这些访问器具有相同的可见性或访问级别:其所属属性或索引器的可见性或访问级别。不过,有时限制对其中某个访问器的访问会很有用。通常是在保持 get 访问器可公开访问的情况下,限制 set 访问器的可访问性。例如:

private string name = "Hello";

public string Name
{
  get
  {
    return name;
  }
  protected set
  {
    name = value;
  }
}

</div>

在此示例中,名为 Name 的属性定义了一个 get 访问器和一个 set 访问器。 get 访问器接受该属性本身的可访问性级别(在此示例中为 public),而对于 set 访问器,则通过对该访问器本身应用 protected 访问修饰符来进行显式限制。
对访问器的访问修饰符的限制
对属性或索引器使用访问修饰符受以下条件的制约:
不能对接口或显式接口成员实现使用访问器修饰符。
仅当属性或索引器同时具有 set 和 get 访问器时,才能使用访问器修饰符。这种情况下,只允许对其中一个访问器使用修饰符。
如果属性或索引器具有 override 修饰符,则访问器修饰符必须与重写的访问器的访问器(如果有的话)匹配。
访问器的可访问性级别必须比属性或索引器本身的可访问性级别具有更严格的限制。
重写访问器的访问修饰符
在重写属性或索引器时,被重写的访问器对重写代码而言,必须是可访问的。此外,属性/索引器和访问器的可访问性级别都必须与相应的被重写属性/索引器和访问器匹配。例如:

public class Parent
{
  public virtual int TestProperty
  {
    // Notice the accessor accessibility level.
    protected set { }

    // No access modifier is used here.
    get { return 0; }
  }
}
public class Kid : Parent
{
  public override int TestProperty
  {
    // Use the same accessibility level as in the overridden accessor.
    protected set { }

    // Cannot use access modifier here.
    get { return 0; }
  }
}

</div>

实现接口
使用访问器实现接口时,访问器不能具有访问修饰符。但是,如果使用一个访问器(如 get)实现接口,则另一个访问器可以具有访问修饰符,如下面的示例所示:

public interface ISomeInterface
{
  int TestProperty
  {
    // No access modifier allowed here
    // because this is an interface.
    get;
  }
}

public class TestClass : ISomeInterface
{
  public int TestProperty
  {
    // Cannot use access modifier here because
    // this is an interface implementation.
    get { return 10; }

    // Interface property does not have set accessor,
    // so access modifier is allowed.
    protected set { }
  }
}

</div>

访问器可访问性域
如果对访问器使用访问某个修饰符,则访问器的可访问性域由该修饰符确定。
如果不对访问器使用访问修饰符,则访问器的可访问性域由属性或索引器的可访问性级别确定。
下面的示例包含三个类:BaseClass、DerivedClass 和 MainClass。每个类的 BaseClass、Name 和 Id 都有两个属性。该示例演示在使用限制性访问修饰符(如 protected 或 private)时,如何通过 BaseClass 的 Id 属性隐藏 DerivedClass 的 Id 属性。因此,向该属性赋值时,将调用 BaseClass 类中的属性。将访问修饰符替换为 public 将使该属性可访问。
该示例还演示 DerivedClass 的 Name 属性的 set 访问器上的限制性访问修饰符(如 private 或 protected)如何防止对该访问器的访问,并在向它赋值时生成错误。

public class BaseClass
{
  private string name = "Name-BaseClass";
  private string id = "ID-BaseClass";

  public string Name
  {
    get { return name; }
    set { }
  }

  public string Id
  {
    get { return id; }
    set { }
  }
}

public class DerivedClass : BaseClass
{
  private string name = "Name-DerivedClass";
  private string id = "ID-DerivedClass";

  new public string Name
  {
    get
    {
      return name;
    }

    // Using "protected" would make the set accessor not accessible. 
    set
    {
      name = value;
    }
  }

  // Using private on the following property hides it in the Main Class.
  // Any assignment to the property will use Id in BaseClass.
  new private string Id
  {
    get
    {
      return id;
    }
    set
    {
      id = value;
    }
  }
}

class MainClass
{
  static void Main()
  {
    BaseClass b1 = new BaseClass();
    DerivedClass d1 = new DerivedClass();

    b1.Name = "Mary";
    d1.Name = "John";

    b1.Id = "Mary123";
    d1.Id = "John123"; // The BaseClass.Id property is called.

    System.Console.WriteLine("Base: {0}, {1}", b1.Name, b1.Id);
    System.Console.WriteLine("Derived: {0}, {1}", d1.Name, d1.Id);

    // Keep the console window open in debug mode.
    System.Console.WriteLine("Press any key to exit.");
    System.Console.ReadKey();
  }
}

</div>

输出:

  Base: Name-BaseClass, ID-BaseClas



 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解C#中三个关键字params,Ref,out
  • 详解三种C#实现数组反转方式
  • 详解C# 利用反射根据类名创建类的实例对象
  • 详解C#用new和override来实现抽象类的重写区别
  • 详解C#把DataTable中数据一次插入数据库的方法
  • 详解c# 类的构造方法
  • 详解C#多线程之线程同步
  • 详解C#中 Thread,Task,Async/Await,IAsyncResult的那些事儿
  • 详解C#中的委托
  • 详解C#中的out和ref

相关文章

  • 2017-05-28c#格式化数字的方法
  • 2017-05-28C#实现按照指定长度在数字前补0方法小结
  • 2017-05-28C#实现Access通用访问类OleDbHelper完整实例
  • 2017-05-28C# 如何获取出错的错误所在行数信息 原创
  • 2017-05-28c#中 String和string的区别介绍
  • 2017-05-28C#使用委托的步骤浅析
  • 2017-05-28C#小数点格式化用法小结
  • 2017-05-28C#生成sitemap站点地图的方法
  • 2017-05-28C#获取并修改文件扩展名的方法
  • 2017-05-28快速解决C# android base-64 字符数组的无效长度问题

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C#从DataTable获取数据的方法
    • C#装饰器模式(Decorator Pattern)实例教程
    • C#常见算法面试题小结
    • C#影院售票系统毕业设计(4)
    • js事件模型与自定义事件实例解析
    • C#备忘录模式(Memento Pattern)实例教程
    • 在web.config和app.config文件中增加自定义配置节点的方法
    • C# 字符串按 ASCII码 排序的方法
    • C#中实现可变参数实例
    • C#静态变量与实例变量实例分析

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有