如何与父类共享属性/方法,但不是公共的

本文关键字:方法 父类 共享 属性 | 更新日期: 2023-09-27 18:19:13

我不确定我的问题是否措辞正确,但我有一个类,需要使一个属性可用于实例化它的任何类,但不使该属性公开。例如:

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

我想在MyClass2中创建一个MyClass1的实例,并能够从MyClass2访问PrivateNum,但我不希望PrivateNum在MyClass2之外可用。当然,我知道private double PrivateNum是不正确的。

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?
我只是用这个例子来说明我想要完成的任务。我记得,VB使用shared来完成这一任务。它在c#中是如何实现的?

如何与父类共享属性/方法,但不是公共的

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

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);

你不能在你的MyClass1中设置变量protected,然后在MyClass2中创建MyClass1子类吗?

我从你的评论中看到,你不希望一些数据被传输到客户端。这很容易做到-只需将您的MyClass2对象映射到没有您想要隐藏的数据的其他类MyClass3。你可以使用AutoMapper