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

部分图片转贴吧: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. 小程序加载大图片 使用widthFix时,图片先拉伸然后才显示完全

    <image src="http://www.ll.com/sss.jpg" mode="widthFix" style="width:180r ...

  2. java中的常量和变量

    变量的概念: 占据着内存中的某一个存储区域; 该区域有自己的名称(变量名)和类型(数据类型); 该区域的数据可以在同一类型范围内不断变化; 为什么要定义变量: 用来不断的存放同一类型的常量,并可以重复 ...

  3. C++调用Lua编程环境搭建及测试代码示例

    C++调用Lua编程环境搭建及测试代码示例 摘要:测试环境是VS2005+LuaForWindows_v5.1.4-45.exe+WIN7 1.安装lua开发环境LuaForWindows_v5.1. ...

  4. Node.js 安装及环境配置 以及google浏览器安装插件并使用

    一.安装环境 1.本机系统:Windows 10 企业版(64位)2.Node.js:node-v10.16.0-x64.msi(64位) 二.安装Node.js步骤 1.下载对应自己系统对应的 No ...

  5. pytorch BiLSTM+CRF代码详解 重点

    一. BILSTM + CRF介绍 https://www.jianshu.com/p/97cb3b6db573 1.介绍 基于神经网络的方法,在命名实体识别任务中非常流行和普遍. 如果你不知道Bi- ...

  6. SpringData Jpa、Hibernate、Jpa 三者之间的关系

    JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架--因为JPA并未提供ORM实现,它只是制订了一些规范,提供了一些编程的API接口,但具体实现则由服 ...

  7. P1000 A+B Problem

    题目描述 给定两个整数\(a,b\),输出它们的和. 输入格式 输入两个整数,表示\(a,b(1 \le a,b \le 10^9)\). 输出格式 输出一个整数,表示答案. 样例输入 20 30 样 ...

  8. HDU 5912 Fraction(模拟)

    Problem Description Mr. Frog recently studied how to add two fractions up, and he came up with an ev ...

  9. P1050 全排列

    题目描述 给定一个正整数n, 按照递增顺序打印数字1到n的所有排列. 输入格式 一个整数n(1<=n<=7). 输出格式 按照递增的顺序输出n的所有排列, 详见样例.请注意,每行末尾不能有 ...

  10. H3C FTP主动数据传输方式