Public Class Temperature
Private dDegrees As Double
Private dFahrenheit As Double
Public Enum InputType
Degrees
Fahrenheit
End Enum
Sub New(ByVal dTemp As Double, eInputType As InputType)
Select Case eInputType
Case InputType.Degrees
dDegrees = dTemp
dFahrenheit = (1.8 * dTemp) + 32
Case InputType.Fahrenheit
dFahrenheit = dTemp
dDegrees = (5 / 9) * (dTemp - 32)
End Select
End Sub
' Properties and methods here
End Class
让我们说这是班级。
在主要代码中我想做这样的事情。
Dim citytemp As New Temperature(35, Temperature.InputType.Degrees)
Dim value as double
'some code
value = citytemp - 18
我不想使用像citytemp.value或citytemp.degrees这样的东西。我只想包含citytemp,并且应该用其替换以度为单位的默认值。
可以像这样构建一个类吗?
我对VC#或VB
都没问题答案 0 :(得分:6)
在C#中,您可以使用隐式和显式转换运算符。在这里查找:http://msdn.microsoft.com/en-us/library/85w54y0a.aspx
我不知道它是如何使用VB(或者是否可能),也不知道语法。
然而,在你的这个特殊场景中,我不会为Temperature类实现这个功能:它只会给设计带来混乱,并使代码难以维护。我认为使用如下语法会更清楚:
value = citytemp.ToCelsius() - 18;
答案 1 :(得分:5)
Public Shared Operator -(t as Temperature, d as double) As Temperature
Return New Temperature(t.dDegrees - d)
End Operator
public static Temperature operator-(Temperature t, double d)
{
return new Temperature(t.dDegrees - d);
}
其他几点说明:
IComparable
和IEquatable
Structure
(vb)或struct
(c#)get
的属性,它应用计算。另请注意,在您的问题中,您已将结果分配给double
,但我举了一个将其作为Temperature
返回的示例,我认为这更有意义。如果您还希望将其分配给double
,则可以添加隐式转换操作,正如Leandro在他的回答中所建议的那样。
答案 2 :(得分:0)
您已经得到了一些答案,但是我在C#中实现您的示例类(使用3个私有变量)...我已经编写了一个简单的控制台应用程序作为关于如何使用它的testharness / example。
由于Double / Integer转换,您的转化代码中存在(潜在)错误,我也为您解决了这个问题。
class Program
{
static void Main(string[] args)
{
Temperature temp = 100;
temp.setTempType(Temperature.InputType.Fahrenheit);
Double theTempinFarenheit = temp.Fahrenheit();
temp.setTempType(Temperature.InputType.Degrees);
Double theTempinCelcius = temp.Celcius();
Double theTempAsJustAValue = (Double)temp;
}
}
[System.Diagnostics.DebuggerDisplay("{dDegrees}")]
public class Temperature
{
private double dDegrees;
private double dCelcius;
private double dFahrenheit;
public enum InputType {
Degrees,
Fahrenheit
}
public Temperature (Double dTemp)
{
dDegrees = dTemp;
}
public Temperature (Double dTemp, InputType eInputType)
{
switch (eInputType)
{
case InputType.Degrees:
dDegrees = dTemp;
dCelcius = dTemp;
dFahrenheit = (1.8 * dTemp) + 32;
break;
case InputType.Fahrenheit:
dCelcius = dTemp;
dFahrenheit = dTemp;
dDegrees = (5.00 / 9.00) * (dTemp - 32);
break;
default:
break;
}
}
public Double setTempType(InputType eInputType)
{
switch (eInputType)
{
case InputType.Degrees:
dCelcius = dDegrees;
dFahrenheit = (1.8 * dDegrees) + 32;
return dDegrees;
case InputType.Fahrenheit:
dFahrenheit = dDegrees;
dCelcius = (5.00 / 9.00) * (dDegrees - 32);
return dFahrenheit;
default:
return dDegrees;
}
}
public static implicit operator Temperature(Double dTemp)
{
return new Temperature(dTemp);
}
public static explicit operator Double(Temperature temp)
{
return temp.dDegrees;
}
public Double Fahrenheit()
{
return dFahrenheit;
}
public Double Celcius()
{
return dCelcius;
}
public override string ToString()
{
return dDegrees.ToString();
}
}