2012-08-07 78 views
3

我对C#和OOP相当陌生,请耐心等待。使用其他类的类字段

我有两个班,不同的命名空间:

namespace Class1 

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

... 

namespace Class2 

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

我创建了一个项目,称为插件,并有一个按钮的形式。该按钮将添加x,y和z。我的问题是:

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

+0

稍后退后一步,定义您的类实际表示的内容。他们不只是变量的桶。 'class1'和'class2'自然没有任何意义。你试图完成的任务可能以任何方式完成,但是“OOP新手”我们应该专注于确定正确的方式。那么,除了一个人为的例子之外,你们的课堂所代表的物理或概念对象是什么? – David 2012-08-07 01:07:45

+0

我有两个类,class1中的变量需要在class2中使用。例如,area = PI * r^2是class1中的一种方法。 Volume = area * depth是class2中的一种方法。此外,我有一个表格,其中将会计算面积和体积。我试图解决的是如何在class1和class2中使用r,然后在按钮事件中使用这些变量。我希望这更清楚。谢谢你的初始回复。 – user1580591 2012-08-07 01:14:46

+0

我在澄清后更新了我的答案,希望它有帮助。 :) – Diego 2012-08-07 01:37:48

回答

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 
+0

-1这实际上并不在课堂申报中 – 2012-08-07 01:10:03

+0

课堂申报中没有什么内容? – Diego 2012-08-07 01:14:28

+0

您正在声明类之外的变量,他想访问类中的变量。 – 2012-08-07 01:17:04

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

让我知道如果我误解了你想要做的事情。希望这可以帮助!

+0

谢谢你的回应David。这是我想要做的。 – user1580591 2012-08-07 01:34:15

+1

很高兴我能帮到你。如果这回答你的问题,不要忘记将其标记为答案。这将有助于您的接受比例,这将在未来的问题上吸引更多高质量的答案。谢谢! – 2012-08-07 02:57:00

0

class2你需要一个对象从class1

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

public double z = class1.x + 5; 
} 
0

这里每个人给你正确的答案访问的领域,但在地区和您在程序上接近问题的体积的情况下,不是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; 
    } 
}