BillWoodruff
Цитата:
viewTrains(string source, string destination): List & lt;itrain>
Это не "выглядит правильно" в том смысле, что это недопустимый код C#. Это похоже на объявление метода, но это не так.
Основное использование интерфейсов состоит в том, чтобы позволить иметь коллекцию различных типов экземпляров объектов, приведенных к одному и тому же типу(типам) интерфейсов, которые они унаследовали; я предполагаю, что именно об этом и идет речь в данном вопросе.
edit: для получения информации о том, как сериализовать коллекцию различных экземпляров класса, которые совместно используют общий интерфейс, как коллекцию "экземпляров интерфейса", см. Этот пост: [
^].
Итак, вам нужно реализовать некоторые классы, которые наследуются от ITrain и имеют свои собственные уникальные свойства, или поля, или методы:
public class RegularTrains : ITrain
{
// implement all the ITrain declared Properties
// unique to this Class
public int YearsInService { get; set; }
public RegularTrains(int id, string name, string source, string dest, int yrsservice)
{
// assign all the ITrain parameters to the correct variables
// unique to this class
YearsInService = yrsservice;
}
}
public enum TechnologyType
{
Maglev,
InternalCombustion,
Other
}
public class HighSpeedTrains : ITrain
{
// implement all the ITrain declared Properties
// unique to this Class
public TechnologyType TechType { get; set; }
public HighSpeedTrains(int id, string name, string source, string dest, TechnologyType techtype)
{
// assign all the ITrain parameters to the correct variables
// unique to this class
TechType = techtype;
}
}
Теперь возникает вопрос: где и как вы создаете и храните список всех поездов. Одним из способов является такой:
public static class AllTrains
{
public static List<ITrain> Trains { set; get; }
public static List<ITrain> ViewTrains(string source, string destination)
{
// use Linq here to compose a List of ITRains where the supplied parameters
// 'source and 'destination match an ITRain
}
}
Итак, здесь у вас есть статический класс, который хранит коллекцию поездов, приведенных к их форме ITrain. Теперь, как список получает добавленные элементы; один из способов-использовать наследующие конструкторы классов:
public RegularTrains(int id, string name, string source, string dest, int yrsservice)
{
// assign all the ITrain parameters to the correct variables
// unique to this class
YearsInService = yrsservice;
// add the current instance to the static List
AllTrains.Trains.Add(this);
}
Тогда вы можете сделать что-то вроде этого:
RegularTrain rtrain = new RegularTrain(1,"r1","Topeka", "Chicago", 14);
HighSpeedTrain strain = new HighSpeedTrain(2, "h1", "Topeka", "Chicago", TechnologyType.Maglev);
var allTrains = AllTrains.ViewTrains("Topeka", "Chicago");
Обратите внимание, что добавление нового экземпляра класса RegularTrain в статический список ITrain не требовало приведения экземпляра к типу ITrain: преобразование неявно в системе типов.
Когда вы приводите объект к интерфейсу, от которого он наследуется, по сути, вы создаете "представление" объекта: это представление ограничивает вас видением (доступом) только свойств или методов, объявленных в интерфейсе: объект все еще "там" со всеми его уникальными полями, свойствами, методами: он не был скопирован.
Используйте IntelliSense в Visual Studio, чтобы изучить список ITrain и посмотреть на конкретный элемент, и вы сможете получить представление о том, как отражение может заглянуть за пределы интерфейса в фундаментальный тип.