如何在 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 中导出 SphereCylinder;我更喜欢使用接口,因为我认为它是一种更通用的解决方案。 不管你决定做什么,请让我建议你遵循一些最佳实践(你会在这里找到几个例子:https://www.roberthalf.com/technology/blog/4-best-practices-for-microsoft-net-framework-and-applications)。 即:

  • 避免调用 class Object。这是一个危险的名字。它可能会因简单的错误输入而与 object 混淆。称其为 GeometrySolid.
  • 选择明确的 属性 名称并将其大写(高度、长度和宽度优于 a、b、c)。

让你的模型尽可能接近你想要表现的现实。正确设计和维护您的 classes 会更容易。