【原】C#两个类互相包含类对象可以吗?
在阅读大牛代码的时候发现了这个问题,之所以标题以问号开头,是因为我还没搞懂这个问题。权当记录,以希望以后搞懂。
部分图片转贴吧:http://tieba.baidu.com/p/6015910029
比如这样是不行的,图来自贴吧:

诉求是在不添加属性、方法和改变访问权限的基础上互相访问私有字段。
路人甲:
1 C# 友元方法有啊。我记得是修改[assembly: InternalsVisibleTo("类名")],这个在assemblyInfo.cs中,之前我使用过。
2 通过反射可以直接拿到。
3 你确定你的私有字段,不需要封装成字段吗?
路人乙:
十之八九是设计错误,十之一二也是可以实现的:反射、嵌套类、internal等。
题主:
我只希望
类A的私有字段m_b可以在类B中访问,
类B的私有字段m_a可以在类A中访问,
除了在这两个类中能访问,外部的任何地方都不能访问。
添加属性可以实现,如下(我也不知道合不合题意):
class A
{
private B mb;
public void Func(B b)
{
mb = b;
mb.MA = (A)this;
}
public B MB
{
get
{
return mb;
}
set
{
mb = (B)value;
}
}
} class B
{
private A m_a;
public void Func(A a)
{
m_a = a;
a.MB = (B)this;
} public A MA
{
get
{
return m_a;
}
set
{
m_a = (A)value;
}
}
} class Program
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
a.MB = b;
b.MA = a; Console.WriteLine(a.GetType());
Console.WriteLine(b.GetType());
Console.WriteLine(a.MB.GetType());
Console.WriteLine(b.MA.GetType()); Console.ReadKey();
}
}
题主的解决方案:
sealed class B:A
{ } sealed class C:A
{ } class Program
{
static void Main(string[] args)
{
C c = new C();
B b = new B(); b.SetMutualInclude(c); Console.WriteLine(b.GetType());
Console.WriteLine(b.MC.GetType());
Console.WriteLine(c.MB.GetType()); //这种情况没有处理,现在为null
Console.WriteLine(b.MB.GetType());
// Console.ReadKey();
}
}
下面是解决上面的问题的解决办法:
abstract class A
{
protected B mb;
protected C mc; public void SetMutualInclude(C c)
{
mc = c;
c.mb = (B)this;
}
public void SetMutualInclude(B b)
{
mb = b;
b.mc = (C)this;
}
} sealed class B : A
{
public C MC
{
get
{
return mc;
}
}
} sealed class C : A
{
public B MB
{
get
{
return mb;
}
}
} class Program
{
static void Main(string[] args)
{
C c = new C();
B b = new B(); b.SetMutualInclude(c); Console.WriteLine(b.GetType());
Console.WriteLine(b.MC.GetType());
Console.WriteLine(c.MB.GetType());
// Console.ReadKey();
}
}
大神的代码好难,什么时候才能全部弄懂啊,摔!
【原】C#两个类互相包含类对象可以吗?的更多相关文章
- 转载:C++中两个类中互相包含对方对象的指针问题
原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...
- 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)
多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...
- C++两个类相互包含引用的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...
- C++中两个类相互包含引用问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...
- 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)
本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...
- 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。
练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...
- 06--谈谈:C++类的“包含”机制
谈谈:C++类的“包含”机制 本人在学习Qt的时候发现了一个非常有趣的现象.有很多函数的调用方法都写成了如下的形式: object.func().func2(); 这令小弟着实不懂.在上面这段代码 ...
- cxf,两个声明导致 ObjectFactory 类中发生冲突
说明先,这里不管是client还是server端都是用java语言编写,如有写得不好,望原谅! 问题 http://localhost:8080/WEB-SMVC/cxf/userService?ws ...
- Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 内存缓存LruCache和磁盘缓存DiskLruCache的封装类,主要用于图片缓存. 效果图 代码分析 内存缓存LruCache和 ...
随机推荐
- 自然语言处理课程(二):Jieba分词的原理及实例操作
上节课,我们学习了自然语言处理课程(一):自然语言处理在网文改编市场的应用,了解了相关的基础理论.接下来,我们将要了解一些具体的.可操作的技术方法. 作为小说爱好者的你,是否有设想过通过一些计算机工具 ...
- C#的选择语句练习(一)
1.请输入一个数x,若x<1,则y=x:若1<=x<10,则y=2x-1:若x>=10,则y=3x-11,要求随意输入一个x值,求出y值. 2.输入问题[你有房子吗?],若回答 ...
- hdu 1045 Fire Net(dfs)
Fire Net Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- SpringBoot2.0--- 多数据源配置
在开发的过程中我们可能都会遇到对接公司其他系统等需求,对于外部的系统可以采用接口对接的方式,对于一个公司开发的两个系统,并且知道相关数据库结构的情况下,就可以考虑使用多数据源来解决这个问题.Spr ...
- 2018-8-10-win10-uwp-自定义控件初始化
title author date CreateTime categories win10 uwp 自定义控件初始化 lindexi 2018-08-10 19:16:50 +0800 2018-2- ...
- TP5 在模板读出Session值
模板取值: <p class="info">后台登录中心{$Request.session.username}</p> 也可以 {$Think.sessio ...
- [转载] Solaris命令使用
摘自: http://www.jb51.net/os/Solaris/18533.html ★6. rm 删除文件 命令格式: rm [-r] filename (filename 可为档名,或档 ...
- nginx服务器究竟是怎么执行php项目
https://jingyan.baidu.com/article/4f34706e3af779e387b56dc7.html CGI全称是“公共网关接口”(Common Gateway Interf ...
- nginx——前端服务环境
背景:之前一直使用tomcat服务器来作为测试环境:(vue项目打包后想测试下生产环境下有没有问题!使用tomcat有各种问题,还怀疑是我们源码有问题?尴尬)今天公司同事才告诉我tomcat是专门为j ...
- Python--day33--当面试时候问到如何解决黏包问题?的回答。