在被调用的构造函数的函数中禁用某些方法
本文关键字:方法 函数 调用 构造函数 | 更新日期: 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() {}
您可以将字段设置为一些默认值,以便在有人使用您的默认构造函数时至少返回一些结果。
您可以在非默认构造函数中设置一个标志,并在任何无参数方法中检查它。这将允许你抛出一个明确的异常。
平心而论,我会考虑使用其中一种方法,而不是同时使用。