C#从一个类访问一个方法,而不是另一个类

时间:2012-08-29 18:30:30

标签: c# methods private-members

如果此问题已经解决,请提前抱歉。

我在C#中创建一个小型库,我希望让A类能够修改B类的数据成员,其中A和B类存在于同一名称空间中,C.D。虽然我希望在命名空间C中的E类无法访问B的数据成员,但这不是一个需要解决的问题。

namespace C.D
{
    class B
    {
        modifier int
            a,
            b;

        public B()
        {
        }
    }

    class A
    {
        public A() {}

        public B DoStuff()
        {
            B b = new B();
            b.a = 1; b.b = 2;
            return b;
        }
    }
}

namespace C
{
    class E
    {
        static void Main(String[] args)
        {
            A a = new A();
            B b = a.DoStuff();
        }
    }
}

在我上面的main方法中,我希望命名空间C.D中的每个类都能够改变B类对象的数据成员,尽管在C.D命名空间之外没有任何内容能够修改B类对象数据成员。

有没有办法通过更改命名空间结构,修饰符或实现特定的设计模式来实现这一目标?

提前谢谢大家。 :)

2 个答案:

答案 0 :(得分:2)

如果您愿意将C.D中的相关类移动到单独的程序集中,则可以使用“内部”访问修饰符。

namespace C.D
{
    class B
    {
        internal int a;
        internal int b;

        public B()
        {
        }
    }
}

答案 1 :(得分:0)

实现这一目标的一种方法是:

  1. 将A类定义移到B类(将其嵌套在class B { ... }内)

  2. 制作B类字段(abprivate

  3. namespace C.D
    {
        class B
        {
            private int a, b;
    
            public B()
            {
            }
    
            class A
            {
                public A() { }
    
                public B DoStuff()
                {
                    B b = new B();
                    b.a = 1; b.b = 2;
                    return b;
                }
            }
        }
    }
    
    namespace C
    {
        class E
        {
            static void Main(String[] args)
            {
                A a = new A();
                B b = a.DoStuff();
            }
        }
    }
    

    实现此目的的另一种方法是创建B类的字段protected,然后使所有应该访问B类字段的类派生自B类。这样您就不需要在Class中嵌套A类B.即

    namespace C.D
    {
        class B
        {
            protected int a, b;
    
            public B()
            {
            }
        }
    
        class A : B
        {
            public A() {}
    
            public B DoStuff()
            {
                B b = new B();
                b.a = 1; b.b = 2;
                return b;
            }
        }
    }
    
    namespace C
    {
        class E
        {
            static void Main(String[] args)
            {
                A a = new A();
                B b = a.DoStuff();
            }
        }
    }