如何与父类共享属性/方法但不公开?

时间:2014-08-22 19:31:46

标签: c#

我不确定我的问题措辞是否正确,但我有一个类需要为实例化它的任何类提供属性,但不要公开该属性。举个例子:

public class MyClass1
{
    private double _PrivateNum = 9499488.07;
    private double PrivateNum
    {
        get
        {
            return _PrivateNum;
        }
    }
}

我想在MyClass2中创建一个MyClass1实例,并且能够从MyClass2访问PrivateNum,但我不希望{My}在MyClass2之外可用。{1}}。我知道PrivateNum当然不正确。

private double PrivateNum

我刚刚举起这个例子来说明我想要完成的事情。我记得,VB使用public class MyClass2 { public MyClass1 myclass1 = new MyClass1(); public double GetSomeData { double PrivateNum = myclass1.PrivateNum; <<== How do I set this in MyClass1 } so I can access it in MyClass2, } but be unavailable outside of MyClass2? 来实现这一目标。它是如何在C#中完成的?

4 个答案:

答案 0 :(得分:1)

C#不像C ++那样具有friend s的概念。类似的想法是internal。如果将属性标记为internal,则只有包中的类可以使用它。当然,这需要您的设计允许将MyClass1MyClass2放在同一个包中。

答案 1 :(得分:0)

C#中没有friend个类。但是,如果您只想将数据公开给创建MyClass1实例的类,那么您可以使用从MyClass1构造函数返回的回调的丑陋代码:

public class MyClass1
{
    private double _privateNum = 9499488.07;

    public MyClass1(out Func<double> callback)
    {
        callback = () => _privateNum;
    }

    // ...        
}

现在只有实例化MyClass1实例的类才能访问此回调:

public class MyClass2
{
    private Func<double> callback;
    public MyClass1 myclass1;

    public MyClass2()
    {
        myclass1 =  new MyClass1(out callback);
    }

    public double GetSomeData()
    {
        double privateNum = callback();
        // ...
    }
}

当然,你总是可以使用反射并将数据保密到所有类:

Type type = myclass1.GetType();
var flags = BindingFlags.Instance | BindingFlags.NonPublic;
var field = type.GetField("_privateNum", flags);
double privateNum = (double)field.GetValue(myclass1);

答案 2 :(得分:0)

您是否只能在protected中创建变量MyClass1,然后只使用MyClass1MyClass2作为子类?

答案 3 :(得分:0)

正如我从您的评论中看到的那样,您不希望将某些数据传输到客户端。它非常容易 - 只需将MyClass2个对象映射到其他没有要隐藏数据的类MyClass3。您可以使用AutoMapper。