代码之家  ›  专栏  ›  技术社区  ›  user310291

访问修饰符、继承和外部程序集

c#
  •  0
  • user310291  · 技术社区  · 14 年前

    假设我在MyFramework命名空间中有一个基类:

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace myFramework
    {
        public class baseClass
        {
            internal int m_value;
    
            internal int getValue() {
                return m_value;
            }
    
            internal void setValue(int value) {
                m_value = value;
            }
    
        }
    }
    

    在MyApplication命名空间中,我从中继承:

    using System;
    using System.Collections.Generic;
    using System.Text;
    using myFramework;
    
    namespace MyApplication
    {
        class InheritedClass: baseClass
        {
        }
    }
    

    在MyApplication命名空间的表单中,我使用它:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using myFramework;
    
    namespace MyApplication
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                InheritedClass inheritedClass = new InheritedClass();
    
                inheritedClass.setValue(10);
                textBox1.Text = inheritedClass.m_value.ToString();
            }
        }
    }
    

    如您所见,我已经用内部修饰符声明了m_值,这样我就可以从窗体访问它。

    现在,如果我在单独的程序集中编译myframework呢?内部将不再工作?那么我能用什么修饰语吗?受保护的人甚至不能做更少的工作。我有义务公开使用吗?

    是否有一个访问修饰符允许拥有一个类(继承类)的对象(窗体)访问他拥有的所有类和父类的所有成员,就像内部的一样,除了内部不考虑所有权,而是在声明类的地方?

    更新:当然在现实世界中,我的基类在形式(或视图)上有严格的语义,所以由我来决定是否应该这样做,我的问题不是我是否应该这样做,我的问题是是否可能,或者我是否有义务使用像契约设计这样的东西,我觉得很愚蠢的添加一个其他满足此类基本要求的工具。

    3 回复  |  直到 14 年前
        1
  •  1
  •   Jon Hanna    14 年前

    形式不是“拥有”阶级,形式可以说是“拥有”该阶级的一个实例,但即使这是相当不清楚的;通常我们用“拥有”的意思是“有最终的责任”,在这种情况下,一个物体必须被处置或其他“清理”在某个点上。

    窗体与基类的内部工作完全无关。如果表单需要访问基类的成员,它应该是公共的。或者,如果基类的成员应该是私有的、内部的、受保护的或受保护的内部成员,那么表单就没有处理它的业务。

    如果你想让一个不相关的类访问有意非公开的成员,你的设计出了问题。

        2
  •  1
  •   Hans Passant    14 年前

    “所有权”在这里没有意义,它们是完全无关的类。最好你能跳过去 InternalsVisibleTo attribute 箍筋。

        3
  •  1
  •   Mark Avenius    14 年前

    基于所示的示例,公共财产将完全满足您的需要。但是,如果您希望隐藏成员(并且提前确切知道哪些程序集需要访问它),InternalsVisibleToAttribute将实现这一点。

    我在不希望公开属性的情况下使用这个,但我需要访问它进行测试。在本例中,我确切地知道,我只希望测试程序集能够访问该属性,并且能够控制如何使用它。