下面介紹了我正在移植到Scala中的C#代碼。無需擔心細節。Scala:泛型類的構造函數中的自我類型
public class GridBase<HexT, SideT, UnitT, SegT> : IGridBase
where HexT : Hex
where SideT : Side
where UnitT : Unit
where SegT : ISeg
{
public GridBase(Geometry<HexT, SideT, UnitT, SegT> geom, IGridBase orig)
{
this.geom = geom;
}
}
public class Scen: Descrip<HexC, SideC, UnitC>, IListsGeom<HexC, SideC, UnitC>
{
public Geometry<HexC, SideC, UnitC, ISegC> geomC;
public override IGeom iGeom { get { return geomC; } }
public HexCList hexCs { get; private set; }
public override HexList<HexC> hexs { get { return hexCs; } }
public SideCList sideCs { get; private set; }
public override SideList<SideC> sides { get { return sideCs; } }
public UnitCList unitCs { get; private set; }
public override KeyList<UnitC> units { get { return unitCs; } }
}
正如馬丁·奧德斯基指出了問題泛型是類型參數的引用文件,其約束引用的數量往往爆炸。但是對於GridBase類,我需要通過泛型來解析類型,而不是抽象類型。所以我想能夠從一個類型參數中獲取多種類型。因此,在斯卡拉我創建的特質對我的類型:
abstract class Hex(val num1: Int){} //These are declared in their own files
abstract class Side {val sideString = "This is a side"}
trait DescripTypes //separate file
{
type HexT <: Hex
type SideT <: Side
}
class ScenTypes extends DescripTypes //separate file
{ //This is an ex of an implemntation of the above in a different package
type HexT = HexC
type SideT = SideC
}
然後,我使用的是自型
class GridBase[T <: DescripTypes](val myHex: HexT) extends DescripTypes
{//Compiler doesn't recognise the HexT type in the constructor
other: DescripTypes =>
type other = T
var testvar = 5 //The rest does nothing at useful at the moment
var testvar2 = "" //just for testing
def mymethod(var1: HexT) //Compiler recognises HexT
{
testvar += var1.num1 //This compiles fine
}
def method2(var1: SideT) //Compiler recognises SideT
{
testvar2 = var1.sideString //This compiles fine
}
}
出於某種原因,我似乎無法使用創建我Gridbase類雖然我可以在課程正文中使用它們,但它仍然是GridBase類構造函數中DescripTypes的類型成員。任何幫助讚賞。但是,這是從一個類型參數中獲取多種類型的最佳方式嗎?
說明:所有類都在單獨的文件中。這裏沒有內部課程。
好的,可能是直接相關的。但我留下了深思,作爲一個excercise :) – ron
好偉大的似乎工作,但我不知道爲什麼。我能找到的#運算符的唯一文檔是針對內部外部類的。 –
@RichOliver我更新了帖子。 – ron