今天看了java的封装性,突然就想到了C#的封装性,怎么样写代码才不违反封装性呢?
public class TestClass
{
public static void Main(string[] args)
{
Test t = new Test();
TestA d = t.D;
Console.WriteLine("t.D=" + t.D.Name);
Console.WriteLine("d=" + d.Name);
d.change("beeyon chen");
Console.WriteLine("change d value after....");
Console.WriteLine("t.D=" + t.D.Name);
Console.WriteLine("d=" + d.Name);
Console.ReadKey();
}
}
class Test
{
private TestA d;
public TestA D
{
get
{
return d;
}
}
public Test()
{
this.d = new TestA();
}
}
class TestA
{
private string name;
public string Name
{
get { return name; }
}
public TestA()
{
this.name = "beeyon";
}
public string change(string name)
{
this.name = name;
return this.name;
}
}
在Test中为了保护Test中的类对象 d ,我们只有设置了get 用来获取d
在main 方法中我们可以看到输出的内容为,红色中的t.D值也改变了,这样就破坏了封装性
t.D=beeyon
d=beeyon
change d value after....
t.D=beeyon chen
d=beeyon chen
因为d = t.D 引用了同一个对象,所以d改变了同一个对象的值.
如果TestA 实现了ICloneable 接口,那就有可以自己实现Clone一个新的对象
public class TestClass
{
public static void Main(string[] args)
{
Test t = new Test();
TestA d = t.D;
Console.WriteLine("t.D=" + t.D.Name);
Console.WriteLine("d=" + d.Name);
d.change("beeyon chen");
Console.WriteLine("change d value after....");
Console.WriteLine("t.D=" + t.D.Name);
Console.WriteLine("d=" + d.Name);
Console.ReadKey();
}
}
class Test
{
private TestA d;
public TestA D
{
get
{
return (TestA)d.Clone();
}
}
public Test()
{
this.d = new TestA();
}
}
class TestA : ICloneable
{
private string name;
public string Name
{
get { return name; }
}
public TestA()
{
this.name = "beeyon";
}
public string change(string name)
{
this.name = name;
return this.name;
}
#region ICloneable 成员
public object Clone()
{
TestA a = (TestA)this.MemberwiseClone();
return a;
}
#endregion
}
输出的内容
t.D=beeyon
d=beeyon
change d value after...
t.D=beeyon
d=beeyon chen
分享到:
相关推荐
本篇将详细介绍如何使用C#封装COM组件,并提供C++调用的解决方案。 标题中的"C# 封装COM组件源码"指的是创建一个C#项目,将其暴露为COM接口,以便非托管的C++代码可以调用。下面我们将详细讲解这个过程: 1. **...
本项目涉及的是利用C#封装Chrome浏览器,从而创建一个可以在桌面应用程序中嵌入的Web浏览组件。这一技术主要适用于混合式移动开发,允许开发者在桌面应用中集成现代Web技术,提供更丰富的用户体验。 首先,我们要...
《OpenDDS订阅发布C#封装详解》 OpenDDS(Open Data Distribution Service)是一个开源的分布式实时数据发布/订阅中间件,它提供了高效、可靠的数据通信服务。在C#环境中,为了方便开发者使用OpenDDS,通常会对其...
C++ DLL提供了高效且低级别的功能,但它的API可能不直接适用于.NET环境,这就是C#封装C++ DLL的重要性。 首先,我们要理解C#和C++之间的差异。C#是基于.NET框架的高级编程语言,而C++则是一种更底层的语言,它可以...
我们可以理解"C#封装的谷歌内核浏览器"是一个利用C#和Chromium技术构建的自定义浏览器解决方案,它结合了C#的编程优势和Chromium的高性能渲染,为企业或个人开发者提供了定制化Web应用的可能性。在实际应用中,这样...
综上所述,C#封装C++是一种常见的跨语言编程技术,它使得开发者可以充分利用C++的性能优势,同时享受C#的高级特性和开发便利性。在实践中,需要关注数据类型转换、异常处理、内存管理等多个方面,以确保程序的稳定性...
总的来说,这个C#封装的adb helper类库为Android开发者和自动化测试人员提供了一站式的解决方案,简化了adb操作,提升了工作效率,降低了出错的可能性。通过学习和使用此类库,开发者可以更加专注于应用程序的逻辑,...
### Java调用C#封装的DLL方法 #### 第一种方法:Java利用JNA进行调用 **背景介绍:** 为了实现Java与C#之间的交互,一种常用的方式是通过调用C#封装的DLL文件来完成特定功能。这种方法涉及到.NET Framework与Java...
总结,Halcon的C#封装和迈德威视摄像头的集成是一项综合性的任务,涉及图像处理、硬件控制以及软件工程实践。通过封装,我们能更高效地利用Halcon的强大功能,同时简化了与特定硬件设备(如迈德威视的摄像头)的交互...
**C#封装Chrome内核浏览器** 是一个技术实践,它涉及到使用C#编程语言与Google Chrome的Chromium内核进行交互,以创建自定义的浏览器应用程序。这种技术通常用于开发桌面应用,提供与Web浏览器类似的功能,但可以...
本篇将深入探讨如何使用C#封装串口通讯类,并理解其中涉及的关键知识点。 1. **C#基础与.NET框架** C#是一种面向对象的编程语言,由微软公司开发,主要用于构建Windows应用程序和服务。它支持.NET框架,这是一个...
C#封装的三维向量,代码封装性还是比较不错的
在本项目中,"OPC C#封装类"是为了简化OPC接口的使用,通过C#编程语言进行了封装,以方便在Visual Studio(VS)环境中进行开发应用。 OPC C#封装库的主要功能是提供一个简洁、易于使用的API,开发者可以借助这个库...
C#中,我们使用访问修饰符(如public、private、protected等)来控制成员的可见性,实现封装。例如,将私有变量(private)用于存储数据,而提供公共方法(public)进行数据的读取和修改,这就是一个基本的封装实践...
总之,通过C#封装微软的NativeWifi库,开发者可以更高效、更安全地管理Windows系统的无线网络功能。`Interop.cs`和`WlanApi.cs`这两份文件是封装的关键,它们分别提供了与原生API的桥梁和面向对象的接口。理解并运用...
### C#封装详解 #### 封装的概念及意义 封装是面向对象编程(OOP)中的一个核心概念,它指的是将数据及其对数据的操作绑定在一起,同时隐藏这些数据和操作的内部实现细节。简而言之,封装是将软件的实现细节进行隔离...
总的来说,C#中的ModBusTCP封装是一种实用的工程实践,它使得开发者可以快速地将ModBus通信功能整合到自己的项目中,提高了开发效率和代码的可维护性。在使用过程中,根据具体需求,可能还需要考虑多线程处理、重试...
本话题聚焦于2022年C#封装的控件,这些控件具有强大的图形处理能力,包括画区域兴趣(ROI)、涂抹、查看灰度值、缩放以及拖动等实用功能。这些功能在图像处理、医学成像、视频分析等领域有广泛应用。 首先,让我们...
本资源“C# socket封装类和组件含例程全部开源”提供了一套全面且强大的C# Socket封装,旨在简化开发过程,提高代码的可读性和可维护性。以下是对这个开源项目的详细解析: 首先,Socket是TCP/IP协议族的基本组成...