мне нужно выполнить операцию на подкласс и возвращает результат:Могу ли я использовать дженерики для изменения подписи метода подкласса?
public interface IEntity { }
public abstract class Entity : IEntity {
public abstract IEntity doStuff(IEntity e1, IEntity e2, IEntity e3);
}
public class Customer : Entity {
public override IEntity doStuff(IEntity e1, IEntity e2, IEntity e3) { // <-- yuck
var customer1 = e1 as Customer; // <-- yuck
var customer2 = e2 as Customer; // <-- yuck
var customer3 = e3 as Customer; // <-- yuck
// do stuff
return foo;
}
}
Я хочу, чтобы избежать этого подкласса сигнатуры методы, и связанные с ним типажами.
Так что я предпочитаю это:
public override Customer doStuff(Customer c1, Customer c2, Customer c3) {
// do stuff
return foo;
}
Как бы я использовать систему типов для достижения этой цели?
EDIT: Я изменил название метода от compare
до doStuff
, чтобы повторить, что сама операция не имеет значения. Я не пытаюсь сравнивать. Я просто хочу изменить типы. Как мне это сделать?
Многие говорили, изменить дизайн, но я не могу сделать. У меня уже есть решение, которое я включил ниже, и он работает. Если у вас есть лучший способ сделать это, не критикуя дизайн (это не главное), пожалуйста, дайте мне знать. Спасибо за вклад каждого.
Я думаю, что важная часть отсутствует в вопросе * почему * вы хотите/должны сделать это таким образом, а не просто «публичный клиент ChooseBetter (Customer c1, Customer c2)» или обычный «IComparable» или ' IEquatable 'реализация. Что вы хотите, чтобы вызывающий абонент мог делать с этими классами? –
31eee384
@ 31eee384 Если у меня есть дерево наследования, мне нужно начать с интерфейса или общего. Кроме того, как уже упоминалось выше, сама операция не является ядром проблемы, так как меняет сигнатуру, которая меня путает. –
Что вы хотите делать, когда 'e1' или' e2' (или оба? Возможно, вам нужен только один параметр, и использовать 'this' для другого ...) являются * not *' Customer's? – 31eee384