如何在 C# 的构造函数中使用重载函数
How to use a overload function in a constructor in c#
我想根据不同的维度和几何标志创建一个几何图形,以确定它是立方体还是圆形。为此,我必须使用重载函数,但我不知道如何在 class 函数中利用这些函数来存储我的输入。这是我到目前为止所做的:
public void Object( double x, double y, double z)
{
name = "Cube";
a = x;
b = y;
c = z;
}
public void Object(double r, double y)
{
name = "Cylinder";
r1 = r;
b = y;
}
protected double a{ get; private set; }
protected double b{ get; private set; }
protected double c{ get; private set; }
protected double r1{ get; private set; }
我遇到的第一个问题是,我不能多次使用声明的变量,我必须为每个可能的对象声明一个变量,在这种情况下我不能在 b 上保存两个变量,有点无效。
我的第二个问题是,如果我想像这样调用数据中的对象 class 以及其他值,它不起作用:
public MeasureObject(double hash, string name, new Object obj(int n, different variables), double coordinates, ...)
{
this.Hash = hash;
this.Object=obj;
}
有没有更好的方法在可以采用整数和 n 个不同维度、长度的对象中实现通用几何?
几何对象之间有足够的差异,最好有单独的 classes。
例如,计算每个体积的方法不同。
一个解决方案可能是拥有一个基础 class 从中继承并拥有一个工厂 class 根据标志确定您需要哪个几何对象实例。
我会制作立方体和圆柱体 class 以及抽象的 class 几何体。然后,您可以将对两个 classes 相同的方法放在摘要 class 中,并覆盖其他方法。
public abstract class Shape
{
public int Height;
public int Width;
public int Depth;
public double Area()
{
return Height * Width;
}
public abstract double Volume();
}
class Square : Shape
{
public Square(int height, int width)
{
Height = height;
Width = width;
}
public override double Volume()
{
throw new NotImplementedException();
}
}
class Cube : Shape
{
public Cube(int height, int width, int depth)
{
Height = height;
Width = width;
Depth = depth;
}
public override double Volume()
{
return Height * Width * Depth;
}
}
我会这样设计我的 classes:
namespace Geometry
{
public interface IMeasurableSolid
{
double CalcSurface();
double CalcVolume();
}
public class Sphere : IMeasurableSolid
{
public double Radius { get; set; }
public Sphere(double radius)
{
if (radius <= 0)
{
throw new ArgumentOutOfRangeException("radius", "value must be positive");
}
this.Radius = radius;
}
public double CalcSurface()
{
return (Math.PI * 4 * Math.Pow(this.Radius, 2));
}
public double CalcVolume()
{
return (Math.PI * 4 * Math.Pow(this.Radius, 3) / 3);
}
}
public class Cylinder : IMeasurableSolid
{
public double Height { get; set; }
public double Radius { get; set; }
public Cylinder(double height, double radius)
{
if (height <= 0)
{
throw new ArgumentOutOfRangeException("height", "value must be positive");
}
if (radius <= 0)
{
throw new ArgumentOutOfRangeException("radius", "value must be positive");
}
this.Height = height;
this.Radius = radius;
}
public double CalcSurface()
{
return 2 * Math.PI * this.Radius * (this.Radius + this.Height);
}
public double CalcVolume()
{
return this.Height * Math.PI * Math.Pow(this.Radius, 2);
}
}
}
您甚至可以按照 Maarten Zeeman 的建议从基础摘要 class 中导出 Sphere
和 Cylinder
;我更喜欢使用接口,因为我认为它是一种更通用的解决方案。
不管你决定做什么,请让我建议你遵循一些最佳实践(你会在这里找到几个例子:https://www.roberthalf.com/technology/blog/4-best-practices-for-microsoft-net-framework-and-applications)。
即:
- 避免调用 class
Object
。这是一个危险的名字。它可能会因简单的错误输入而与 object
混淆。称其为 Geometry
或 Solid
.
- 选择明确的 属性 名称并将其大写(高度、长度和宽度优于 a、b、c)。
让你的模型尽可能接近你想要表现的现实。正确设计和维护您的 classes 会更容易。
我想根据不同的维度和几何标志创建一个几何图形,以确定它是立方体还是圆形。为此,我必须使用重载函数,但我不知道如何在 class 函数中利用这些函数来存储我的输入。这是我到目前为止所做的:
public void Object( double x, double y, double z)
{
name = "Cube";
a = x;
b = y;
c = z;
}
public void Object(double r, double y)
{
name = "Cylinder";
r1 = r;
b = y;
}
protected double a{ get; private set; }
protected double b{ get; private set; }
protected double c{ get; private set; }
protected double r1{ get; private set; }
我遇到的第一个问题是,我不能多次使用声明的变量,我必须为每个可能的对象声明一个变量,在这种情况下我不能在 b 上保存两个变量,有点无效。
我的第二个问题是,如果我想像这样调用数据中的对象 class 以及其他值,它不起作用:
public MeasureObject(double hash, string name, new Object obj(int n, different variables), double coordinates, ...)
{
this.Hash = hash;
this.Object=obj;
}
有没有更好的方法在可以采用整数和 n 个不同维度、长度的对象中实现通用几何?
几何对象之间有足够的差异,最好有单独的 classes。
例如,计算每个体积的方法不同。
一个解决方案可能是拥有一个基础 class 从中继承并拥有一个工厂 class 根据标志确定您需要哪个几何对象实例。
我会制作立方体和圆柱体 class 以及抽象的 class 几何体。然后,您可以将对两个 classes 相同的方法放在摘要 class 中,并覆盖其他方法。
public abstract class Shape
{
public int Height;
public int Width;
public int Depth;
public double Area()
{
return Height * Width;
}
public abstract double Volume();
}
class Square : Shape
{
public Square(int height, int width)
{
Height = height;
Width = width;
}
public override double Volume()
{
throw new NotImplementedException();
}
}
class Cube : Shape
{
public Cube(int height, int width, int depth)
{
Height = height;
Width = width;
Depth = depth;
}
public override double Volume()
{
return Height * Width * Depth;
}
}
我会这样设计我的 classes:
namespace Geometry
{
public interface IMeasurableSolid
{
double CalcSurface();
double CalcVolume();
}
public class Sphere : IMeasurableSolid
{
public double Radius { get; set; }
public Sphere(double radius)
{
if (radius <= 0)
{
throw new ArgumentOutOfRangeException("radius", "value must be positive");
}
this.Radius = radius;
}
public double CalcSurface()
{
return (Math.PI * 4 * Math.Pow(this.Radius, 2));
}
public double CalcVolume()
{
return (Math.PI * 4 * Math.Pow(this.Radius, 3) / 3);
}
}
public class Cylinder : IMeasurableSolid
{
public double Height { get; set; }
public double Radius { get; set; }
public Cylinder(double height, double radius)
{
if (height <= 0)
{
throw new ArgumentOutOfRangeException("height", "value must be positive");
}
if (radius <= 0)
{
throw new ArgumentOutOfRangeException("radius", "value must be positive");
}
this.Height = height;
this.Radius = radius;
}
public double CalcSurface()
{
return 2 * Math.PI * this.Radius * (this.Radius + this.Height);
}
public double CalcVolume()
{
return this.Height * Math.PI * Math.Pow(this.Radius, 2);
}
}
}
您甚至可以按照 Maarten Zeeman 的建议从基础摘要 class 中导出 Sphere
和 Cylinder
;我更喜欢使用接口,因为我认为它是一种更通用的解决方案。
不管你决定做什么,请让我建议你遵循一些最佳实践(你会在这里找到几个例子:https://www.roberthalf.com/technology/blog/4-best-practices-for-microsoft-net-framework-and-applications)。
即:
- 避免调用 class
Object
。这是一个危险的名字。它可能会因简单的错误输入而与object
混淆。称其为Geometry
或Solid
. - 选择明确的 属性 名称并将其大写(高度、长度和宽度优于 a、b、c)。
让你的模型尽可能接近你想要表现的现实。正确设计和维护您的 classes 会更容易。