this is my first posted question, so when I'm missing something or did something wrongplease let me know. :)
I try to create a generic class which should be used to create grids. So I'm inheriting from that generic class and passing all the needed arguments. For some reason the compiler isn't able to resolve the inheritance of my different classes and I'm not sure what's the reason behind it, since I'm not really used to Generics inside Inheritance.
Error Message:
Error CS1503 Argument 1: cannot convert from 'GridXZ<BattleGridObject>
' to 'GridXZ<GridXZObject>
' BattleGridSystem.cs 7
So the compiler cannot convert BattleGridObject
to GridXZObject
. That's weird for me, since BattleGridObject
is inheriting from GridXZObject
. So what's the obvious point I'm missing here?
As far as I know BattleGridObject should be casted/converted (?) into his base class GridXZObject without any problem.
BattleGridSystem.cs
public class BattleGridSystem : MonoBehaviour
{
public BattleGrid Grid;
private void Awake()
{
Grid = new BattleGrid(10, 10, 5, Vector3.zero, (grid, x, z) => new BattleGridObject(grid, x, z));
}
}
BattleGrid.cs
public class BattleGrid : GridXZ<BattleGridObject>
{
public BattleGrid(int width, int height, float cellSize, Vector3 originPosition, Func<GridXZ<BattleGridObject>, int, int, BattleGridObject> createGridObject)
: base(width, height, cellSize, originPosition, createGridObject)
{
}
}
BattleGridObject.cs
public class BattleGridObject : GridXZObject
{
public BattleGridObject(GridXZ<GridXZObject> grid, int x, int z) : base(grid, x, z)
{
}
}
GridXZ.cs
public abstract class GridXZ<TGridXZObject> where TGridXZObject : GridXZObject
{
public event EventHandler<OnGridXZObjectChangedEventArgs> OnGridObjectChanged;
public readonly int Width;
public readonly int Height;
public readonly float CellSize;
protected readonly Vector3 OriginPosition;
protected readonly TGridXZObject[,] GridArray;
public GridXZ(int width, int height, float cellSize, Vector3 originPosition, Func<GridXZ<TGridXZObject>, int, int, TGridXZObject> createGridObject)
{
Width = width;
Height = height;
CellSize = cellSize;
OriginPosition = originPosition;
GridArray = new TGridXZObject[width, height];
for (var x = 0; x < GridArray.GetLength(0); x++)
{
for (var z = 0; z < GridArray.GetLength(1); z++)
{
GridArray[x, z] = createGridObject(this, x, z);
}
}
}
}
GridXZObject.cs
public abstract class GridXZObject
{
protected readonly GridXZ<GridXZObject> Grid;
protected readonly int X;
protected readonly int Z;
public GridXZObject(GridXZ<GridXZObject> grid, int x, int z)
{
Grid = grid;
X = x;
Z = z;
}
public override string ToString()
{
return $"{X}, {Z}";
}
}
OnGridXZObjectChangedEventArgs.cs
public class OnGridXZObjectChangedEventArgs : EventArgs
{
public int X;
public int Z;
}