2016-07-06 32 views
1

我有一個通用的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)。

有人知道解決這個問題的更優雅的方式嗎?

+0

我已經創建了這種確切的東西,我做的方式是通過將任意尺寸表示爲5個基本尺寸的合理權力:長度,質量,時間,溫度和電流。因此,不是每個可能的組合都有不同的類別,只有一個類別表示數量的維度。你仍然沒有編譯時的安全性,但是我不能想到一個強制執行的方法,不用硬編碼每個維度的組合。 – Kyle

+0

+你所擁有的事實:爲操作傳遞一個單位實例,爲操作提供3種不同的單位類型(至少如果兩者都相同,則更容易找到解決方法),但現在像現在這樣,以通用的方式編碼它似乎非常困難。 –

+0

謝謝你的想法!我得出這樣的結論:對於泛型而言,這可能是不可能的。因此,我不使用泛型,而是使用T4模板爲所有可用單元自動生成硬編碼數量。這樣我就可以擁有編譯時類型安全性和所有我想要的操作符。 – user6557194

回答

0

,以避免在你的情況下空類,我可以看到的唯一的辦法就是做這樣的事情:

interface INumeric<T> 
{ 
    T Add(T num); 
    T Substract(T num); 
    T Multiply(T num); 
    T Divide(T num); 
} 
class Quantity<T> where T : INumeric<T> 
{ 
    public T Value { get; set; } 
    public static Quantity<T> operator + (Quantity<T> left, Quantity<T> right) 
    { 
     return new Quantity<T>() { Value = left.Value.Add(right.Value) }; 
    } 

    public static Quantity<T> operator - (Quantity<T> left, Quantity<T> right) 
    { 
     return new Quantity<T>() { Value = left.Value.Substract(right.Value) }; 
    } 

    public static Quantity<T> operator/(Quantity<T> left, Quantity<T> right) 
    { 
     return new Quantity<T>() { Value = left.Value.Divide(right.Value) }; 
    } 

    public static Quantity<T> operator * (Quantity<T> left, Quantity<T> right) 
    { 
     return new Quantity<T>() { Value = left.Value.Multiply(right.Value) }; 
    } 
} 

然後,你必須實現UnitINumeric<T>和各單位可以有它自己實現這個方法

+0

這不能工作,因爲T可以是不同的單位類型,並且您忘記了在數量構造函數中使用單位參數。 –

相關問題