zoukankan      html  css  js  c++  java
  • 【原】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();
                }
            }

    大神的代码好难,什么时候才能全部弄懂啊,摔!

  • 相关阅读:
    _ 下划线 Underscores __init__
    Page not found (404) 不被Django的exception中间件捕捉 中间件
    从装修儿童房时的门锁说起
    欧拉定理 费马小定理的推广
    线性运算 非线性运算
    Optimistic concurrency control 死锁 悲观锁 乐观锁 自旋锁
    Avoiding Full Table Scans
    批量的单向的ssh 认证
    批量的单向的ssh 认证
    Corrupted MAC on input at /usr/local/perl/lib/site_perl/5.22.1/x86_64-linux/Net/SSH/Perl/Packet.pm l
  • 原文地址:https://www.cnblogs.com/sggggr/p/11854882.html
Copyright © 2011-2022 走看看