如何与父类共享属性/方法,但不是公共的
本文关键字:方法 父类 共享 属性 | 更新日期: 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
,则只有包中的类可以使用它。当然,这需要您的设计允许将MyClass1
和MyClass2
放在同一个包中。
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