从另一个类访问和设置一个类的实例变量

时间:2013-12-17 16:28:01

标签: c#

我目前有一个叫做的课程:

public class HeatmapComponent : GH_Component

我还有另一个叫做的课程:

public class HeatMap

Heatmap类中,我有两个实例变量声明为:

public int _width;
public int _height;

我希望能够从_width类访问和设置_heightHeatmapComponent变量。我知道这是一个范围问题,但是,我对需要做什么感到困惑。

在我的HeatmapComponent课程中,这就是我的想法:

this._width = width; // width is declared somewhere in this class
this._height = height; // height is same as above

如果这是一个愚蠢的问题,我事先道歉。如果我遗漏了代码段,请告诉我。我很乐意提供。

4 个答案:

答案 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传递事物一样,在构建新实例时,您可以使用/仅提供 。这就是为什么他们被称为constructorreadonly 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);
}

确保你明白发生了什么。