【原】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和 ...
随机推荐
- OP_REQUIRES failed at conv_ops.cc:386 : Resource exhausted: OOM when allocating tensor with shape..
tensorflow-gpu验证准确率是报错如上: 解决办法: 1. 加入os.environ['CUDA_VISIBLE_DEVICES']='2' 强制使用CPU验证-----慢 2.'batch ...
- 洛谷P1595 信封问题 题解 错排问题
作者:zifeiy 标签:排列组合,错排问题 题目链接:https://www.luogu.org/problem/P1595 题目描述:某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都 ...
- 2019-8-15-win10-edge-打开闪退问题
title author date CreateTime categories win10 edge 打开闪退问题 lindexi 2019-08-15 08:53:22 +0800 2019-8-1 ...
- post提交方式为什么要序列化,而Get提交方式就不用?序列化做了什么?
这是因为后台能够直接处理的数据格式,是一种经过序列化的键值对数据,比如前端要向后台提交三个参数,分别是a=1,b=2,c=3,那么后台接收到的数据就应该是a=1&b=2&c=3(可以看 ...
- H3C配置Hybrid端口
- 个人脚手架搭建 -- charmingsong-cli
个人脚手架搭建 -- charmingsong-cli 目的 为了解决多次构建相同功能的项目,在一定程度上需要定制化以及私有化设置 设计 问题 为什么不用现成的脚手架生成? 如果利用vue或者reac ...
- opacity兼容性以及存在问题处理
opacity兼容性以及存在问题处理 opacity兼容性 opacity属性是CSS3的属性,用于设置元素的不透明级别.语法: opacity: value | inherit; ①值value表示 ...
- SPA+.NET Core3.1 GitHub第三方授权登录 使用AspNet.Security.OAuth.GitHub
GitHub第三方授权登录 使用SPA+.NET Core3.1实现 GitHub第三方授权登录 类似使用AspNet.Security.OAuth.GitHub,前端使用如下:VUE+Vue-Rou ...
- 【Docker】企业级镜像仓库harbor的搭建(http/https)及使用
一:用途 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器. 二:安装docker-ce 环境:阿里云轻量应用服务器CentOS 7.3 这里通过yum Docker源仓 ...
- JMeter数据库测试计划
在系统上安装数据库服务器之后. 按着这些次序: 创建名为testdb的数据库. 创建表 - tb_user. 将记录插入到tb_user表中. 下图显示了创建的数据库及其记录. 注意:您需要将相应的J ...