【问题标题】:using class fields from other classes使用其他类的类字段
【发布时间】:2012-08-03 23:52:18
【问题描述】:

我对 C# 和 OOP 还很陌生,所以请多多包涵。

我有两个具有不同命名空间的类:

namespace Class1

public class class1
{
 public double x;
 public double y;
}

...

namespace Class2

public class class2
{
 public double z = x + 5;
}

我创建了一个名为 add 的项目,并有一个带有按钮的表单。该按钮将添加 x、y 和 z。我的问题是:

如何在 class2 中使用字段 x 以及如何在按钮单击事件下使用字段 x、y 和 z?

【问题讨论】:

  • 退后一步,定义你的类实际代表什么。它们不仅仅是变量的桶。 class1class2 自然不传达任何意思。您尝试完成的工作可能以多种方式完成,但作为“OOP 新手”,我们应该专注于确定正确的方式。那么,除了人为的示例之外,您的类打算表示哪些物理或概念对象?
  • 我有两个类,其中 class1 中的变量需要在 class2 中使用。例如,area = PI * r^2 是 class1 中的一个方法。体积 = 面积 * 深度是 class2 中的一种方法。另外,我有一个带有按钮的表格,可以计算面积和体积。我试图解决的是如何在 class1 和 class2 中使用 r,然后在按钮事件中使用这些变量。我希望这更清楚。感谢您的初步回复。
  • 在您澄清后我更新了我的答案,希望对您有所帮助。 :)
  • @user1580591: "area = PI * r^2" and "volume = area * depth" - 我要说的重点不过,这些听起来不像是有意义的阶级区别。在几何的情况下,每个单独的完整形状都可能是一个类。因此,如果有一些 3 维对象被建模,它本身就是一个类。它的各种尺寸和测量值将是该类的属性(静态或计算)。能够相互访问类是 OOP 的一个方面,但能够有有意义的类区别确实是第一位的。

标签: c# oop class


【解决方案1】:

您不使用类字段(除非它们是静态的,但在您的情况下它们不是),而是使用对象字段。下面是一个示例,说明如何实现您想要的。

public class1 {
  public double Radius;

  // Function to calculate the area
  public double Area(double Rad) {
    this.Radius = Rad;
    return Math.PI * Math.Pow(this.Radius, 2);
  }

}

public class2 {
  public double Depth;

  // Function to calculate the volume of a cylinder
  public double Volume(double Rad, double Dep) {
    this.Depth = Dep;

    // Create an instance of Class1 and use it to calculate the Volume
    var Obj1 = new class1();
    return Obj1.Area(Rad) * this.Depth;
  }
}

如何在按钮点击事件中使用上述内容

// Let's calculate an Area from a Radius
double SomeRadius = 1.234;

MyObj1 = new class1();
double Area = MyObj1.Area(SomeRadius);

double StoredRadius = MyObj1.Radius; // This will give you back the Radius stored by MyObj1, which is the same you passed to Area() function

// Now let's calculate a Volume, using the Radius we indicated earlier and a Depth
double SomeDepth = 4.567;
MyObj2 = new class2();
double Volume = MyObj2.Volume(SomeRadius, SomeDepth);

double StoredDepth = MyObj2.Depth; // This will give you back the Depth stored by MyObj2, which is the same you passed to Volume() function

【讨论】:

  • 类的声明中没有什么?
  • 你在类外声明变量,他要访问类内的变量。
  • 我正在实例化对象以使用类,它显示了如何使用对象的属性。这回答了他提出的关于在方法中使用 x、y 和 z 的问题。现在他更新了问题,这让事情变得更清楚了。
  • 啊我现在明白了,我已经编辑以确保未来的观众更清楚
【解决方案2】:

您可能希望class2 在其构造函数中接收class1 的实例:

public class class2
{
 private readonly class1 _c1;
 public class2(class1 c1) { _c1 = c1; }

 public double z = _c1.x + 5;
}

至于如何在表单中通过按钮单击事件使用字段 x、y 和 z,您只需访问 class1 和 class2 实例上的公共字段 x、y 和 z:

protected void button_click(){
 class1 c1 = new class1();
 c1.x = 10;
 c1.y = 20;
 class2 c2 = new class2(c1);

 //do something with c1 and c2 now...
 Console.WriteLine("{0} {1} {2}", c1.x.ToString(), c1.y.ToString(), c2.z.ToString());
}

如果我误解了您要执行的操作,请告诉我。希望这会有所帮助!

【讨论】:

  • 感谢您的回复大卫。这就是我想要做的。
  • 很高兴我能帮上忙。如果这回答了您的问题,请不要忘记将其标记为答案。这将有助于您的接受百分比,这将在未来的问题上吸引更多高质量的答案。谢谢!
【解决方案3】:

class2 中,您需要从class1 创建一个对象

public class class2
{
class1 class1 = new class1(); 

public double z = class1.x + 5;
}

【讨论】:

    【解决方案4】:

    这里的每个人都为您提供了访问字段的正确答案,但在面积和体积的情况下,您是在程序上解决问题,而不是 OO 方式。这是一个示例,向您展示如何访问内部字段,以及解决此类问题的 OO 方法:

    public abstract class Shape
    {
        public abstract double Area();
        public abstract double Perimeter();
    }
    
    public class Circle : Shape
    {
        public double Radius;
    
        public override double Perimeter()
        {
            return 2 * Radius * Math.PI;
        }
    
        public override double Area()
        {
            return Radius * Radius * Math.PI;
        }
    }
    
    public class Square : Shape
    {
        public double Side;
    
        public override double Perimeter()
        {
            return Side * 4;
        }
    
        public override double Area()
        {
            return Side * Side;
        }
    }
    
    public abstract class Solid
    {
        public abstract double Volume();
    }
    
    public abstract class CircleBaseSolid : Solid
    {
        protected Circle Base = new Circle();
    
        public double Radius
        {
            get { return Base.Radius; }
            set { Base.Radius = value; }
        }
    
        public double Height;
    }
    
    public class Cylinder : CircleBaseSolid
    {
        public override double Volume()
        {
            return Base.Area() * Height;
        }
    }
    
    public class Cone : CircleBaseSolid
    {
        public override double Volume()
        {
            return Base.Area() * Height / 3;
        }
    }
    
    public abstract class SquareBaseSolid : Solid
    {
        protected Square Base = new Square();
    
        public double Side
        {
            get { return Base.Side; }
            set { Base.Side = value; }
        }
    
        public double Height;
    }
    
    public class SquareParallelepiped : SquareBaseSolid
    {
        public override double Volume()
        {
            return Base.Area() * Height;
        }
    }
    
    public class SquarePyramid : SquareBaseSolid
    {
        public override double Volume()
        {
            return Base.Area() * Height / 3;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-21
      • 2018-01-21
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 2020-08-30
      相关资源
      最近更新 更多