Anmol Limje Ответов: 1

Как мне объявить это в C#


Как мне объявить это в интерфейсе и классе В C#.

viewTrains(string source,string destination):List<ITrain>


Я делаю консольное приложение, есть требование этого метода, но я в замешательстве, как объявить этот метод в интерфейсе и наследовать в классе. Я много искал, например, "список с интерфейсом типа", но ничего не нашел. а также, Пожалуйста, скажите мне, что называется в C#. Пожалуйста, Помогите Мне. Спасибо.

Что я уже пробовал:

Я Пытался:-
interface ITrain
{
        int Id { get; set; }
        string Name { get; set; }
        string Source { get; set; }
        string Destination { get; set; }
}

public List<ITrain> viewTrains(string source, string destination)
{
   
}

правильно ли это ? если да, то, пожалуйста, приведите пример этого.

PIEBALDconsult

Выглядит нормально, но ваши намерения не ясны.

Maciej Los

Что ViewTrains метод должен делать? Не поймите меня неправильно, я знаю, что вы хотите вернуть список поездов, но что source и destination переменные существуют для, особенно из-за их типа (строки)?

1 Ответов

Рейтинг:
12

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 и посмотреть на конкретный элемент, и вы сможете получить представление о том, как отражение может заглянуть за пределы интерфейса в фундаментальный тип.


Karthik_Mahalingam

5!

BillWoodruff

Спасибо, Картик

Richard MacCutchan

5 от меня тоже отличное описание. Теперь я понимаю интерфейсы C#.

BillWoodruff

Привет, Ричард, я нахожу идею, что могу научить тебя чему-нибудь о любом аспекте C# и .NET ... несколько невероятной :) Ты меня разыгрываешь здесь ?

Имейте в виду, что я сосредоточился только на одном аспекте использования интерфейсов ... тот, который я считал подходящим для вопросов ОП (и моей оценки того, где они могут быть в своем исследовании/практике).

Если у вас есть какие-либо предложения или критические замечания по поводу того, что я здесь написал, Я и, я уверен, другие могут только извлечь пользу из ваших глубоких знаний.

Richard MacCutchan

Вовсе нет, я всегда стараюсь узнать что-то новое. И из того, что вы написали выше (и что я думаю, что понимаю), есть тонкая разница между интерфейсами C# и некоторыми другими языками. Определенно никакого вытягивания ног, подразумеваемого или нет.

Maciej Los

Согласитесь!
Билл, мне нужно было прочитать твой ответ 2 раза, чтобы понять, что ты хочешь сказать...
5ед!

Orcun Iyigun

Хорошо сказано, потрясающее объяснение!Мои 5:)