Поскольку (как подразумевается) все эти типы уже наследуются от Bounds
, вам не нужно приводить List<Room>
или List<Zone>
к List<Bounds>
.
Вы можете сделать это:
bool BoundsOverlapsOtherBounds<T>(Bounds bound, List<T> bounds) where T : Bounds
Общее ограничение означает, что вы можете передать любой List<T>
в метод, если T
реализует или наследует Bounds
.
Так что, если у вас есть List<Room>
, вы можете передать его методу без явного приведения:
var rooms = new List<Room>();
var otherBounds = new Bounds();
var overlaps = BoundsOverlapsOtherBounds(otherBounds, rooms);
Вам даже не нужно указывать универсальный аргумент, потому что он выводится.
Если по какой-либо причине эти объекты не имеют общего типа, то, скорее всего, им следует это сделать. Наследование - это решение , но нам не нужно его использовать, чтобы типы имели общую характеристику. Иногда это рисует нас в угол. Интерфейс также может иметь смысл:
interface IHasBoundaries // not a great name?
{
Boundaries Bounds { get; }
}
Это полиморфизм. Множество форм (или типов) могут реализовывать интерфейс, и вам абсолютно все равно, что отличает их - только то, что у них общего. Вы можете написать код, который имеет дело с IHasBoundaries
, и в этом контексте вам нужно знать об этих объектах только то, что они реализуют интерфейс.
Тогда ваш метод выглядит так:
bool BoundsOverlapsOtherBounds<T>(IHasBoundaries bound, List<T> bounds)
where T : IHasBoundaries