关闭

如何使用C++ 11实现C#属性概念设计

发表于:2016-8-09 09:43

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Plato    来源:51Testing软件测试网采编

  1、概述
  本人对“C++实现C#属性概念”的研究决定并非一时冲动,而是原自于对技术的热爱。
  用过C#的C渣渣程序员/媛都非常喜欢C#里面的属性的概念(注意,C#里的属性和成员变量之间是有区别的),可是C渣渣里并没有属性这个概念,于是,很多程序员/媛都想办法使用C渣渣抽象出类似C#中的属性的概念,当然我也不例外。
  看过很多网友and同事写的C++属性实现方案,But似乎都没有找到很符合口味的实现,不是太难看懂就是太难使用。
  so,本文介绍的是博主在工作过程中封装的C++实现属性的方法,不敢说多好用,但从使用形式上看,个人觉得与我了解到的方案中,博主实现的方案有如下特点:
  1、易用且非常接近C#的使用风格。
  2、代码量少,很容易看懂。
  下面将一步一步介绍一些实现上的细节。
  2、C# 属性的概念
  本想略过对C#属性的介绍,但考虑到读者可能没使用过C#,也不知道C#的属性到底有什么用,因此还是稍微从使用的角度先解释一下C#中属性的概念(如果您对属性已经足够了解,可直接跳过本章或直接从下面第2点的“C++实现效果与C#效果对比”开始)。
  一下内容包含如下部分:
  1、简单示例代码介绍C#中的属性;
  2、C++实现效果与C#效果对比;
  1、简单示例代码介绍 C# 中的属性
  我们来看第一段C#代码:
//示例代码1.0 
class TestDemo
{
public String Name
{
get;
set;
}
}
class Program
{
static void Main(string[] args)
{
TestDemo test = new TestDemo();
test.Name = "test";
System.Console.WriteLine(test.Name);
}
}
  上面代码中,我们创建了一个String类型的属性Name,这个时候我们,我们的属性其实跟一个成员变量没啥区别,只是一个成员变量罢了。
  另外,还需要读者了解的是,属性里的get和set分别控制属性的读写权限:
  1、如果只有get,那么Name为只读模式;
  2、如果只有set,那么Name为只写模式;
  只读模式示例代码:
//示例代码1.0
class TestDemo
{
public String Name
{
get;
}
}
class Program
{
static void Main(string[] args)
{
TestDemo test = new TestDemo();
test.Name = "test";//只读属性,赋值不允许,编译出错
System.Console.WriteLine(test.Name);
}
}
  只写模式示例代码:
//示例代码1.0
class TestDemo
{
public String Name
{
set;
}
}
class Program
{
static void Main(string[] args)
{
TestDemo test = new TestDemo();
test.Name = "test";
System.Console.WriteLine(test.Name);  //只写模式,test.Name取值不允许,编译失败
}
}
  我们再来看一个复杂点的例子:
//示例代码1.0 
class TestDemo
{
public String Name
{
get
{
return _name;
}
set
{
_name = value;
TestWork();
}
}
public void TestWork()
{
System.Console.WriteLine(_name);
}
private String _name;
}
class Program
{
static void Main(string[] args)
{
TestDemo test = new TestDemo();
test.Name = "test";
}
}
  以上代码中,我们运行到第28行的时候,会进入到第10行,最终运行结果打印出“test”。
  是的,其实很简单,如果没有属性,我们完全可以用一个私有的成员函数,然后为每个成员函数添加一个get和set的方法(java下的通常做法),如下代码中的TestDemo完全能实现上面代码中属性的做法:
//示例代码1.0
class TestDemo
{
public String GetName()
{
return _name;
}
public void SetName(String value)
{
_name = value;
TestWork();
}
public void TestWork()
{
System.Console.WriteLine(_name);
}
private String _name;
}
……
  OK,那为什么要有属性呢?
  其实追求的真是一种书写方法吧,属性能让我们像访问成员变量一样访问直接赋值和取值,同时,在赋值和取值的时候,能根据需求调用相应的内部实现函数。
  2、C++实现效果与C#效果对比
  请读者对比下左右两边的属性Name的定义方式,C#里面的get和set方法在C++11实现中,使用了property_getter和property_setter实现,property_getter和property_setter中代码的实现方式与C#均一致。
  OK,看完属性效果比较,如果您觉得对你的胃口,那么可以继续往下看,下面会有关于proerty_rw更详细的说明。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号