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

部分图片转贴吧: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. Python--day69--ORM外键的正向查询和反向查询

    什么是正向查询,什么是方向查询?

  2. set_time_limit(0)是什么意思?

    语法 : void set_time_limit (int seconds) 说明 : 设定一个程式所允许执行的秒数,如果到达限制的时间,程式将会传回错误.它预设的限制时间是30秒,max_execu ...

  3. Python--day48--ORM框架SQLAlchemy之子查询

    一定要把第一次查询的结果作为一个结果再进行查询:代码后面加.subquery()标明是子查询 1,简单的子查询 #select * from (select * from tb) as B q1 = ...

  4. [WC2013]平面图——平面图点定位

    [WC2013]平面图 码农题 平面图点定位: 1.平面图转对偶图:[HNOI2016]矿区 2.扫描线点定位 把所有的顶点和询问点排序,扫描线 每个边在fr的位置加入,to的位置删除,竖直直线不要 ...

  5. html(三)注册页面与重定向

    注册和登陆的建立是通过界面post提交表单然后在测试界面获取提交的值,进行判断. 1.测试传来的值,是否为空,将值传回到测试界面: ("Reg.jsp?errorCode=" + ...

  6. 前端开发之JavaScript

    JavaScript JS是一种脚本语言,浏览器执行,用于渲染HTML网页,实现网页的动画效果. JavaScript的引用方式: 1,在HTML文件中script标签中写JS代码 <scrip ...

  7. Spring Data Jpa 简单使用事务

    对于两张表,需要顺序操作,必须全部表均操作成功才可,否则两张表不操作. 例如,现在有device,collectionpoint两张表,向两张表顺序执行insert操作 SQL如下 INSERT IN ...

  8. 【t085】Sramoc问题

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] Sramoc(K,M)表示用数字0,1,2,...,K-1组成的自然数中能被M整除的最小数.给定K,M ...

  9. python基础十一之装饰器进阶

    函数的双下划线方法 def hahahha(): """测试函数""" print('zxc') print(hahahha.__name_ ...

  10. element 树形控件使用

    <el-tree :data="morkDataList" show-checkbox ref="tree" node-key="id" ...