在被调用的构造函数的函数中禁用某些方法

本文关键字:方法 函数 调用 构造函数 | 更新日期: 2023-09-27 18:18:27

我刚完成学业,准备开始申请。在申请之前,我希望有一个工具箱,里面装满了我可以在任何地方使用的工具。

我正在处理一个小问题,不知道什么是"最佳实践"。

我希望下面的类能够以复数方式使用。在我的"Main"中,我希望能够以不同的方式调用一些函数:

MyDistance a = new MyDistance();
int b = a.Orthodrome(1.5 , 2.3, 5.8, 4.1);

并且,我也希望能够这样使用它:

MyDistance a = new Distance(1.5 , 2.3, 5.8, 4.1);
int b = a.Orthodrome();
int c = a.Loxodrome();

我的问题是,在我的"主",我被允许这样做:

MyDistance a = new MyDistance();
int b = a.Orthodrome();

总是返回一个错误。

他是我班上"MyDistance"的一员,我只是给出了"for information",我不知道它是否有用。

public class MyDistances
{
    private double _Lat1;
    private double _Long1;
    private double _Lat2;
    private double _Long2;
    /// <summary>
    /// Constructeur de la classe MyDistances. Il construit la classe avec les coordonnées géographiques de 2 points.
    /// </summary>
    /// <param name="lat1">Lattitude du premier point</param>
    /// <param name="long1">Longitude du premier point</param>
    /// <param name="lat2">Lattitude du second point</param>
    /// <param name="long2">Longitude du second point</param>
    public MyDistances(double lat1, double long1, double lat2, double long2)
    {
        this._Lat1 = (lat1 * Math.PI) / 180;
        this._Lat2 = (lat2 * Math.PI) / 180;
        this._Long1 = (long1 * Math.PI) / 180;
        this._Long2 = (long2 * Math.PI) / 180;
    }
    public MyDistances()
    {
        //Do nothing here.
    }
    /// <summary>
    /// Cette méthode retourne une distance exprimée en kilomètres, entre 2 points de l'espact
    /// </summary>
    /// <param name="lat1">La lattitude du premier point, exprimée en degrés</param>
    /// <param name="long1">La longitude du premier point, exprimées en degrés</param>
    /// <param name="lat2">La lattitude du second point, exprimée en degrés</param>
    /// <param name="long2">La longitude du second point, exprimée en degrés</param>
    /// <returns>Le typ</returns>
    public int Orthodrome(double lat1, double long1, double lat2, double long2)
    {
        this._Lat1 = (lat1 * Math.PI) / 180;
        this._Lat2 = (lat2 * Math.PI) / 180;
        this._Long1 = (long1 * Math.PI) / 180;
        this._Long2 = (long2 * Math.PI) / 180;
        return Orthodrome();
    }
    public int Orthodrome()
    {
        int distance = -1;
        try
        {
            distance = (int)Math.Round(2 * 6370 * Math.Asin(Math.Sqrt((Math.Sin((_Lat1 - _Lat2) / 2) * Math.Sin((_Lat1 - _Lat2) / 2) + Math.Cos(_Lat1) * Math.Cos(_Lat2) * Math.Sin((_Long1 - _Long2) / 2) * Math.Sin((_Long1 - _Long2) / 2)))));
        }
        catch (Exception)
        {
            throw;
        }
        return distance;
    }
}

如果调用的构造函数没有属性,我应该怎么做才能避免调用没有属性的方法?

顺便说一下,如果你发现我做错了什么,请不要犹豫,告诉我。我当然还有很多东西要学。

在被调用的构造函数的函数中禁用某些方法

您应该将Orthodrome(double,double,double,double)设置为静态

public static int Orthodrome(double lat1, double long1, double lat2, double long2)
{
    double Lat1 = (lat1 * Math.PI) / 180;
    double Lat2 = (lat2 * Math.PI) / 180;
    double Long1 = (long1 * Math.PI) / 180;
    double Long2 = (long2 * Math.PI) / 180;
    distance = CalculateOrthodrome(Lat1, Lat2, Long1, Long2);
    return distance;
}

现在在您的主程序中,您可以执行以下操作:

MyDistance.Orthodrome(2.3, 1.5, 2.8, 3.2);

你不需要再提前呼叫MyDistance a = new MyDistance()了。这类方法(函数)被称为静态(非实例)。

编辑:考虑到你对复制代码的担忧:

private static int CalculateOrthodrome(double lat1, double long1, double lat2, double long2)
{
    return (int)Math.Round(2 * 6370 * Math.Asin(Math.Sqrt((Math.Sin((Lat1 - Lat2) / 2) * Math.Sin((Lat1 - Lat2) / 2) + Math.Cos(Lat1) * Math.Cos(Lat2) * Math.Sin((Long1 - Long2) / 2) * Math.Sin((Long1 - Long2) / 2)))));
}

现在使用CalculateOrthodrome方法的实例和非实例方法

将无参数构造函数设为私有:

private MyDistance() {}

您可以将字段设置为一些默认值,以便在有人使用您的默认构造函数时至少返回一些结果。

您可以在非默认构造函数中设置一个标志,并在任何无参数方法中检查它。这将允许你抛出一个明确的异常。

平心而论,我会考虑使用其中一种方法,而不是同时使用。