Если вам абсолютно необходимо было использовать два списка базового класса:
public abstract class Unit()
{
public abstract Unit Add(Unit other);
public void MatchType(Unit other)
{
if(this.GetType() != other.GetType())
throw new ArgumentException("Units not of same type");
}
}
... затем реализуйте следующее в каждом производном классе:
public override void Add(Unit other)
{
MatchType(other);
//actual implementation
}
затем расширьте эту функциональность в ваших производных классах с помощью фактической реализации Add.
Честно говоря, я не вижу смысла в том, что вы пытаетесь сделать. Это не сработало бы, если бы оба списка не содержали только Меры или только Веса, и вы просто скрываете этот факт от потребителя, помещая проверку типов в Unit. Это просто напрашивается на неприятности.
Я бы определил код, в котором у вас есть эти два списка, следующим образом:
public List<T> AddLists<T>(List<T> firstList, List<T> secondList) where T:Unit
{
//your code to add elements
}
... затем используйте общий метод Unit.Add () следующим образом:
public static void Add<T>(this T item, T other) where T:Unit
{
//perform something that works like item += other
}
Вы должны использовать списки, строго типизированные по весу или измерению. Вы можете попытаться преобразовать универсальный параметр List, используя Linq:
listOfMeasures = listOfUnits.OfType<Weight>().ToList();
Конечно, это приведет к тому, что веса будут отфильтрованы из списка, но это может работать в ваших интересах:
listOfWeights = listOfUnits.OfType<Weight>().ToList();
listOfMeasures = listOfUnits.OfType<Measure>().ToList();
var addedListOfMeasures = AddLists(listOfMeasures, otherListOfMeasures);
var addedListOfWeights = AddLists(listofWeights, otherListOfWeights);
Приведенный выше код, используемый с общими методами AddLists и Unit.Add (), которые я изложил, будет безопасным для типов и, следовательно, не будет генерировать никаких исключений времени выполнения. Не делает это хорошо; любой новый созданный вами модуль потребует добавления дополнительного кода для обработки каждого нового типа.