我目前有一个叫做的课程:
public class HeatmapComponent : GH_Component
我还有另一个叫做的课程:
public class HeatMap
在Heatmap
类中,我有两个实例变量声明为:
public int _width;
public int _height;
我希望能够从_width
类访问和设置_height
和HeatmapComponent
变量。我知道这是一个范围问题,但是,我对需要做什么感到困惑。
在我的HeatmapComponent
课程中,这就是我的想法:
this._width = width; // width is declared somewhere in this class
this._height = height; // height is same as above
如果这是一个愚蠢的问题,我事先道歉。如果我遗漏了代码段,请告诉我。我很乐意提供。
答案 0 :(得分:2)
您想要设置这两个字段的值吗?他们是readonly
。您可以在构造函数中执行 only 。
public class HeatMap
{
private readonly int _width;
private readonly int _height;
public HeatMap(int wid, int hei)
{
_width = wid;
_height = hei;
}
}
而且,正如通过构造函数的params传递事物一样,在构建新实例时,您可以使用/仅提供 。这就是为什么他们被称为constructor
和readonly fields
:
public class HeatmapComponent
{
private int widthOfMap;
private int heightOfMap;
void createMapAndDoSomething()
{
var hmap = new HeatMap(widthOfMap, heightOfMap);
hmap.thing();
}
}
如果您不想创建新的HeatMap,并且您希望能够在任何时间点从某个“外部”位置设置宽度/高度,那么:
例如:
public class HeatMap
{
private int _width;
private int _height;
public void SetSize(int wid, int hei)
{
_width = wid;
_height = hei;
}
}
public class HeatmapComponent
{
private int widthOfMap;
private int heightOfMap;
private HeatMap oldMap;
void changeTheSizes()
{
oldMap.SetSize(widthOfMap, heightOfMap);
}
}
有时甚至更好,使用属性:
public class HeatMap
{
private int _width;
private int _height;
public int Width { set { _width = value; } }
public int Height { set { _height = value; } }
}
public class HeatmapComponent
{
private int widthOfMap;
private int heightOfMap;
private HeatMap oldMap;
void changeTheSizes()
{
oldMap.Width = widthOfMap;
oldMap.Height = heightOfMap;
}
}
答案 1 :(得分:1)
一些事情:
readonly
关键字只能在constructor
中设置任何内容。例如:
class XYZ
{
private readonly int x;
public XYZ()
{
x = 10; //works
}
public void SomeMethod()
{
x = 100; //does not work since it is readonly
}
}
然后是各种访问修饰符:private
只能在类本身中访问,protected
可以在继承的类中访问,public
可以在任何地方访问。 Internal
可在同一程序集中访问。
public class HeatMapComponent
{
HeatMap _map;
public HeatMapComponent()
{
_map = new HeatMap();
}
public void SomeMethod()
{
_map.Width = 10; //should work if Width is public and not readonly and if _map was initialized already, ie not null
}
}
答案 2 :(得分:1)
在我回答您的问题之前,您有一个主要的主要问题:readonly
。这意味着一旦创建了对象,就无法更改变量的值。任何人。期
现在,您有几种方法可以做到这一点。首先是使用像Snorre这样的属性说。实际上,你会得到这个:
public class HeatMap
{
public int Width { get; set; }
public int Height { get; set; }
}
public class HeatMapComponent
{
private HeatMap myHeatMap; // Must have a reference to the object you want to change!
public void SomeMethod()
{
myHeatMap.Width = 10;
}
}
现在,明显的缺点是任何人都可以改变HeatMap的属性。如果由于某种原因你真的想要使HeatMap的宽度和高度可以由HeatMapComponent编辑 ,你可以将HeatMapComponent设为inner class,如下所示:
public class HeatMap
{
private int width;
private int height;
public class HeatMapComponent
{
public HeatMap myHeatMap;
public void SomeMethod()
{
myHeatMap.width = 10;
}
}
}
但是,我强烈建议你重新考虑一下你要做的事情。根据我的经验,公共内部课程实际上非常罕见,因为它们可以轻松地违反OOP原则。不同的应用程序设计可能更适合您。
答案 3 :(得分:0)
这听起来像是一个家庭作业问题,问题是你不理解这一课。
这是一种创建 HeatMap 类的方法。它包含一个重载,因此您可以在构造函数中设置Width和Height,也可以通过Set方法设置:
public class HeatMap {
public HeatMap() {
Width = 0;
Height = 0;
}
public HeatMap(int width, int height) {
Width = width;
Height = height;
}
public void Set(int width, int height) {
Width = width;
Height = height;
}
public int Width { get; private set; }
public int Height { get; private set; }
}
要在 HeatmapComponent 类中使用此功能,您只需要创建 HeatMap 的实例。这有两种方法:
public HeatmapComponent() {
}
public void Test1(int width, int height) {
var hm = new HeatMap(width, height);
Console.WriteLine("Width: {0}, Height: {1}", hm.Width, hm.Height);
}
public static void Test2(int width, int height) {
var hm = new HeatMap();
hm.Set(width, height);
Console.WriteLine("Width: {0}, Height: {1}", hm.Width, hm.Height);
}
确保你明白发生了什么。