基本OOP相关查询

时间:2013-10-17 20:03:58

标签: c#

我有一个基本的疑问,我想在C#编程时可能会非常常见。

基本上这里描述了我当前代码的结构:

文件: api.cs

namespace API
{
    class OutputClass{
        private int var1;
        private int var2;
        int getVar1()
        {
            return var1;
        }
        int getVar2()
        {
            return var2;
        }
    }

    class APICore {
        public event Action<OutputClass> FrameDecodeComplete;
        void someFunction() {
            OutputClass myOutput;

            myOutput.var1 = 1;    
            myOutput.var2 = 2;

            FrameDecodeComplete(myOutput);
        }
    }
}

我的要求是此API的用户创建一个APICore类型的对象,并以OutputClass对象的形式接收输出。

显然,myOutput.var1 = 1;myOutput.var2 = 2;行会因为它的保护级别而引发错误。

但我还需要确保API的用户无法为var1,var2设置值。所以我不想将var1和var2的访问级别更改为public。我也不想定义诸如setVar1(),setVar2()之类的函数。

请发表评论。

5 个答案:

答案 0 :(得分:3)

如果您不希望外部程序集能够访问您的变量,那么您可以使用internal关键字。

class OutputClass
{
    public int Var1 { get; internal set; }
}


该语法是属性,这是一种可用于为您的字段制作getter和setter的语法。

我向您展示的语法是以下

的简写
class OutputClass
{    
    private int _var1;
    public int Var1 
    {
        get
        {
            return _var1;
        }
        internal set
        {
            _var1 = value;
        }
    }
}

答案 1 :(得分:1)

检查internal关键字,看起来它解决了您的问题

但你也可以使用2个参数向你的OutputClass添加内部构造函数方法,因此someFunction将调用构造函数并返回对象,在构造函数中你将能够初始化私有变量

答案 2 :(得分:1)

听起来他们的保护级别应为internal。这样,var1var2只会在声明它们的程序集中可见。

http://msdn.microsoft.com/en-us/library/7c5ka91b%28v=vs.90%29.aspx

答案 3 :(得分:1)

如果您希望用户可以访问get属性,但不能访问set属性,那么您可以创建这样的访问者属性。

public int var1 { get; private set; }

通过这种方式,您可以在类中自行修改变量,并且类的使用者可以访问该值,但不能更改它。

答案 4 :(得分:0)

OutputClass一个受保护的构造函数,该构造函数接受设置var1var2的参数,然后给APICore一个派生自OutputClass并传递参数的私有嵌套类到受保护的基础构造函数。

类似的东西:

class OutputClass{
    private int var1;
    private int var2;
    int getVar1()
    {
        return var1;
    }
    int getVar2()
    {
        return var2;
    }

    protected OutputClass(int _var1, int _var2)
    {
        var1 = _var1;
        var2 = _var2;
    }
}

class APICore {
    public event Action<OutputClass> FrameDecodeComplete;
    void someFunction() {
        SubOutputClass myOutput = new SubOutputClass(1,2);

        FrameDecodeComplete(myOutput);
    }

    private SubOutputClass : OutputClass
    {
        public SubOutputClass(int var1, int var2) : base(var1, var2)
        {
        }
    }
}

使用internal 相同程序集中的任何类都可以访问它。这对你来说可能是一个问题,也可能不是。