If I want to see if a piece can move from one square to another, I need to know if that square is occupied.
And in what way does testing if the square has a piece in its piece field not solve that problem? I'm still not seeing the need for a separate field.
2. Trolls and dwarfs have different rules for movement and capture.
Then they should implement abstract methods from the base class which define how those rules affect them respectively. If you're constantly checking to see what type they are, you're defeating the purpose of inheritance, and in fact you would actually be better off not inheriting at all.