2012-08-07 69 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; 
    } 
}