我刚完成学业,我即将开始申请。在申请之前我想要的一件事是一种工具箱,充满了我能在任何地方使用的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;
}
}
如果被调用的构造函数没有任何属性,我应该怎么做以避免能够在没有属性的情况下调用方法?
顺便说一句,如果你发现其他任何我做错的事,请不要犹豫。我当然还有很多需要学习的东西。
答案 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)
您可以将字段设置为某些默认值,这样如果有人使用您的默认构造函数,您至少可以返回一些结果。
您可以在非默认构造函数中设置一个标志,并在任何无参数方法中进行检查。这将允许你抛出一个明确的例外。
平心而论,我会考虑采用一种方法,而不是两种方法。