禁用已调用的构造函数的某些方法

时间:2013-06-15 13:38:13

标签: c# oop

我刚完成学业,我即将开始申请。在申请之前我想要的一件事是一种工具箱,充满了我能在任何地方使用的dll。

我实际上处理的是一个小问题,并且真的不知道会是什么"最佳实践"为此。

我希望以下类能够以多种方式使用。在我的" 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();

我遇到的问题是,在我的" Main"中,我被允许这样做:

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

总会返回错误。

他是我班级的一部分" MyDistance",我只是提供信息",我不知道它是否有用。

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

}

如果被调用的构造函数没有任何属性,我应该怎么做以避免能够在没有属性的情况下调用方法?

顺便说一句,如果你发现其他任何我做错的事,请不要犹豫。我当然还有很多需要学习的东西。

3 个答案:

答案 0 :(得分:1)

你应该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方法。

答案 1 :(得分:0)

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

private MyDistance() {}

答案 2 :(得分:0)

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

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

平心而论,我会考虑采用一种方法,而不是两种方法。