在阅读大牛代码的时候发现了这个问题,之所以标题以问号开头,是因为我还没搞懂这个问题。权当记录,以希望以后搞懂。

部分图片转贴吧: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#两个类互相包含类对象可以吗?的更多相关文章

  1. 转载:C++中两个类中互相包含对方对象的指针问题

    原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...

  2. 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)

    多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...

  3. C++两个类相互包含引用的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...

  4. C++中两个类相互包含引用问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...

  5. 【转】两道面试题,带你解析Java类加载机制(类初始化方法 和 对象初始化方法)

    本文转自 https://www.cnblogs.com/chanshuyi/p/the_java_class_load_mechamism.html 关键语句 我们只知道有一个构造方法,但实际上Ja ...

  6. 扩展银行项目,添加一个(客户类)Customer类。Customer类将包含一个Account对象。

    练习目标-使用引用类型的成员变量:在本练习中,将扩展银行项目,添加一个(客户类)Customer类.Customer类将包含一个Account对象. 任务 在banking包下的创建Customer类 ...

  7. 06--谈谈:C++类的“包含”机制

    谈谈:C++类的“包含”机制   本人在学习Qt的时候发现了一个非常有趣的现象.有很多函数的调用方法都写成了如下的形式: object.func().func2(); 这令小弟着实不懂.在上面这段代码 ...

  8. cxf,两个声明导致 ObjectFactory 类中发生冲突

    说明先,这里不管是client还是server端都是用java语言编写,如有写得不好,望原谅! 问题 http://localhost:8080/WEB-SMVC/cxf/userService?ws ...

  9. Cache【硬盘缓存工具类(包含内存缓存LruCache和磁盘缓存DiskLruCache)】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 内存缓存LruCache和磁盘缓存DiskLruCache的封装类,主要用于图片缓存. 效果图 代码分析 内存缓存LruCache和 ...

随机推荐

  1. Unity 鼠标控制视角功能和动画播放冲突解决办法

    环境是 unity 5.6.4 情况说明: 1 模型动画单独播放是没问题的. 2 鼠标控制模型是没问题的. 3 在start中播放模型动画,即使鼠标控制视角代码还挂载着,但是模型却无法用鼠标旋转等操作 ...

  2. 关于浏览器ip代理导致定位错乱问题的坑

    http://m.welltrend.com.cn/网站在Android手机的qq浏览器或者uc浏览器或者在微信中打开连接访问时,点击右侧的聊天按钮,经常出现手机在北京结果定位到天津的问题,或者广州的 ...

  3. Python--day68--Django ORM常用字段、不常用的字段、自定义字段

    ORM和数据库的对应关系: Django ORM 常用字段和参数 常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建 ...

  4. 微信小程序下拉刷新 并重新加载数据

    1.在json页面配置: { "enablePullDownRefresh": true } 2.调用刷新函数 onPullDownRefresh: function() { wx ...

  5. H3C 路由度量值(Metric)

  6. tensorflow在文本处理中的使用——skip-gram模型

    代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...

  7. 深入理解CSS盒模型(转)

    转自:https://www.cnblogs.com/chengzp/p/cssbox.html 基本概念 盒模型的组成大家肯定都懂,由里向外content,padding,border,margin ...

  8. Oracle 和pl/sql以及pl/sql developer

    oracle是厂家的名字,也是数据库产品的名字.比如sybase公司的sybase数据库.而微软公司的数据库产品就叫sqlserver了. pl/sql 是oracle数据库所用的sql语言的名称.微 ...

  9. CodeForces 1213F (强联通分量分解+拓扑排序)

    传送门 •题意 给你两个数组 p,q ,分别存放 1~n 的某个全排列: 让你根据这两个数组构造一个字符串 S,要求: (1)$\forall i \in [1,n-1],S_{pi}\leq S _ ...

  10. JMeter数据库测试计划

    在系统上安装数据库服务器之后. 按着这些次序: 创建名为testdb的数据库. 创建表 - tb_user. 将记录插入到tb_user表中. 下图显示了创建的数据库及其记录. 注意:您需要将相应的J ...