我有一個通用的Quantity<T>
類管理的物理量,看起來是這樣的:我可以重載運算符爲特定版本的泛型類嗎?
public class Quantity<T> where T : Unit
{
public Quantity(double value, T unit)
{
this.OriginalUnit = unit;
this.Value = unit.ConvertBack(value);
}
...
}
的Unit
類管理的不同單位的數量可以是,但它不是真正相關的我的問題。
我想什麼做的是在通用Quantity<T>
類是這樣定義操作符:
public static Quantity<ElectricResistanceUnit> operator/
(Quantity<ElectricVoltageUnit> q1, Quantity<ElectricCurrentUnit> q2)
{
return new Quantity<ElectricResistanceUnit>(q1.Value/q2.Value, ElectricResistanceUnit.Ohm);
}
但是,這並不編譯(「二進制運算符的參數之一必須是包含類型」) 。有沒有辦法解決?這個工程
的一種方式,這是不是真的對我一個解決方案,如下:
public class ElectricVoltage : Quantity<ElectricVoltageUnit>
{
public static ElectricResistance operator /(ElectricVoltage q1, ElectricCurrent q2)
{
return new ElectricResistance(q1.Value/q2.Value, ElectricResistanceUnit.Ohm);
}
}
public class ElectricCurrent : Quantity<ElectricCurrentUnit>
{
}
public class ElectricResistance : Quantity<ElectricResistanceUnit>
{
}
這樣做的問題是:我必須定義一個空的派生類爲我所有Unit
S(這是一個很好的),再加上這使我在組成分類靈活(不能投Quantity<ElektricResistanceUnit>
至ElectricResistance
)。
有人知道解決這個問題的更優雅的方式嗎?
我已經創建了這種確切的東西,我做的方式是通過將任意尺寸表示爲5個基本尺寸的合理權力:長度,質量,時間,溫度和電流。因此,不是每個可能的組合都有不同的類別,只有一個類別表示數量的維度。你仍然沒有編譯時的安全性,但是我不能想到一個強制執行的方法,不用硬編碼每個維度的組合。 – Kyle
+你所擁有的事實:爲操作傳遞一個單位實例,爲操作提供3種不同的單位類型(至少如果兩者都相同,則更容易找到解決方法),但現在像現在這樣,以通用的方式編碼它似乎非常困難。 –
謝謝你的想法!我得出這樣的結論:對於泛型而言,這可能是不可能的。因此,我不使用泛型,而是使用T4模板爲所有可用單元自動生成硬編碼數量。這樣我就可以擁有編譯時類型安全性和所有我想要的操作符。 – user6557194