У меня возникает проблема при попытке получить доступ к интерфейсу на классе реализации. Проблема в том, что во время выполнения у меня только определенный тип (Cat), поэтому мое приложение ломается, когда оно пытается выполнить.Кастинг с generics
Вот что у меня есть:
public class Animal {}
public class Cat : Animal {}
public interface IPetSitter {}
public interface IPetSitter<T> IPetSitter where T : Animal {
T Pet { get; set; }
}
public class Kid { }
public class NeighborhoodKid : Kid, IPetSitter<Animal> {
Animal Pet { get; set; }
}
// --- Implementation ---
// Kid Timmy is instantiated elsewhere
// Animal type "A" is passed in dynamically
if (Timmy is IPetSitter) {
((IPetSitter<A>)Timmy).Pet = new A();
}
Этот бросок будет ошибка, если типы не совпадают. Я хотел бы сделать что-то вроде этого:
public interface IPetSitter {
object Pet { get; set; }
}
public interface IPetSitter<T> : IPetSitter where T : Animal {
new T Pet { get; set; }
}
// --- Implementation ---
NeighborhoodKid Timmy = new NeighborhoodKid();
((IPetSitter)Timmy).Pet = new Cat();
Но что заставляет что-либо реализующий IPetSitter иметь как [объект Pet] и [Cat Pet] свойства.
Буду признателен за любые идеи. Благодарю.
UPDATE: я должен был бы сделать его более ясным на начальном этапе, но иногда я буду создавать Kid
класс, а иногда NeighborhoodKid
класс. Вот почему мне нужно бросить IPetSitter<T>
. Не все дети, которых я создаю, будут сидеть с домашними животными. Это начинает звучать жуткий.
Почему бы не просто 'Timmy.Pet = new Cat();'? – SwDevMan81
Это не сработает, потому что 'NeighborhoodKid' не обязательно имеет свойство« Pet ». Вам нужно указать его как своего рода «IPetSitter», чтобы его получить. –
Montlebalm