Си диез / Говнокод #25533 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
using System;
// Интерфейс места содержит координату его расположения
interface IPlace { long Distance { get; } }
// Интерфейс "двигатель" имеет его мощность
interface IEngine { float Power { get; } }
// Интерфейс Транспорт содержит двигатель и функция расчета времени на путь к определенному месту
interface IVehicle { IEngine Engine { get; } float TimeToTrip(IPlace place); }
// Интерфейс человека, имеющего дом и какой-либо транспорт
interface IPerson { IPlace Home { get; } IVehicle Vehicle { get; } }

// Описываем некоторые классы, реализующие интерфейс места
class Home : IPlace { public long Distance => 0; }      // Класс дома, расположенного в начале координат
class Work : IPlace { public long Distance => 100; }    // Класс рабочего офиса и расстояние до него
class School : IPlace { public long Distance => 58; }   // Класс школы. Она расположена ближе к началу

// Петя -- это рабочий человек, ездящий на работу на автомобиле
class Petya : IEngine, IVehicle, IPerson
{
    IVehicle car; // автомобиль
    IEngine engine; // двигатель внешнего сгорания
    IPlace home; // Петин дом

    public float Power => 80f; // максимальная мощность двс в км/ч
    public IEngine Engine => engine; // возвращаем двигатель авто
    public IPlace Home => home; // возвращаем Петин дом
    public IVehicle Vehicle => car; // возвращаем авто как транспорт

    // Рассчитываем время, требуемое на путь
    public float TimeToTrip(long distance) => distance / Engine.Power;
    public float TimeToTrip(IPlace place) => TimeToTrip(place.Distance - home.Distance);

    // Конструктор Пети, принимающий транспорт и его двигатель
    public Petya(IEngine engine, IVehicle vehicle)
    { car = vehicle; this.engine = engine; }
    // Конструктор, задающий Петин дом
    public Petya(IPlace place = null)
    {   // Если дома нет, создаем его сами
        home = place ?? new Home();
        car = this; engine = this;
    }
}

// Иван -- школьник, он ездит в школу на велосипеде
class Ivan : IEngine, IVehicle, IPerson
{
    IVehicle bike; // Ваня ездит на велосипеде
    IEngine legs; // в качестве двигателя выступают Ванины ноги
    IPlace home; // дом Вани

    public float Power => 15f; //максимальная скорость Ваниных ног в к/мч
    public IEngine Engine => legs; // возвращаем ноги в виде двигателя
    public IPlace Home => home; // возвращаем Ванин дом
    public IVehicle Vehicle => bike; // возвращаем велосипед как транспорт

    // Рассчитываем время, требуемое на путь
    public float TimeToTrip(long distance) => distance / Engine.Power;
    public float TimeToTrip(IPlace place) => TimeToTrip(place.Distance - home.Distance);

    // Конструктор Вани, принимающий транспорт и его двигатель
    public Ivan(IEngine engine, IVehicle vehicle)
    { bike = vehicle; legs = engine; }
    // Конструктор, задающий Ванин дом
    public Ivan(IPlace place = null)
    {   // Если дома нет, создаем его сами
        home = place ?? new Home();
        bike = this; legs = this;
    }
}

class InterfacesLesson
{
    // Вспомогательный метод для вывода на экран нужной нам информации
    static void PrintInfo(IPerson person, IPlace place)
    {
        Console.WriteLine("{0} едет из {1} в {2} за {3:f2} ч.",
            person, person.Home, place, person.Vehicle.TimeToTrip(place));
    }

    static void Main()
    {
        IPlace // Создаем несколько мест
            home = new Home(),
            work = new Work(),
            school = new School();

        IPerson // Создаем несколько людей
            petya = new Petya(),
            ivan = new Ivan(),
            egor = new Ivan(school);

        // Проверяем, кто за какое время добирается к нужному месту
        PrintInfo(petya, home);
        PrintInfo(petya, work);
        PrintInfo(ivan, school);
        PrintInfo(egor, work);
        PrintInfo(egor, home);

        Console.ReadLine();
    }
}

Вот таким примером учат в одном известном ВУЗе интерфейсам...

Запостил: groser groser, (Updated )

Комментарии (27) RSS

      • Видимо, школа — это семинария при монастыре. Иван доучился, постригся в монахи под именем Егор и теперь там и живет, а домой только наведывается.
        Ответить
  • > // Интерфейс "двигатель" имеет его мощность
    Кто кого имел?..
    Ответить
  • > class Petya : IEngine, IVehicle
    Чо-о-о-о, блядь?

    Какой-то ёбанный франкенштейн этот ваш Петя. Я, конечно, не гуру ООП'а, но то, что «наследование» — это «is-a» отношение, помню.
    Ответить
  • Жил-был художник один,
    Домик имел и холсты.
    Но он актрису имел любил,
    Ту, что любила цветы.
    Ответить
  • > long Distance
    Скучно, наверное, жить в одномерном мире.
    Ответить
  • Этот код позволяет использовать одного пацана в качестве двигателя для другого:
    Petya petya = new Petya();
    Ivan ivan = new Ivan();
    Petya PetyaRidesOnIvan = new Petya(ivan, ivan);
    Ivan IvanRidesOnPetya = new Ivan(petya, petya);
    Ответить
  • PrintInfo(economist, deli_22);
    PrintInfo(collective_farmer, people);
    PrintInfo(salesman, store);
    PrintInfo(match, library);
    PrintInfo(big_sheet, newsreel);
    PrintInfo(tiny_sheet, library);
    PrintInfo(handbook, gertsen_street);
    PrintInfo(economics, deli_22);
    PrintInfo(library, hundred_twenty_units);
    PrintInfo(ilya_muromets, stadium_dinamo);
    PrintInfo(ilya_muromets, home);
    PrintInfo(television, murmansk_peninsula);
    Ответить
    • Можно весь код, пожалуйста?
      Хочу понять, кто из них Петя, а кто Ваня.
      Ответить
  • хм... ну вроде бы буквы, вроде латинские...
    а что это за хуйета написана в заголовке "c#"?..
    что здесь забыла нота ДО с решеткой

    или си диез, если уж на то пошло
    Ответить
    • До-диез. Странно, что тут нет других нот со знаками альтерации, например, фа-диеза.
      Ответить
    • Си-диез (B#) —– это до (C).

      Кстати, забавно что до-бемоль —– это B.
      Ответить
      • Да, но это верно только для 12-ступенчатой равномернотемперированной шкалы.

        Есть шкалы с неравномерным темпераментом, в которых диезы не совпадают с бемолями. Например, историческая шкала Пифагора не содержала иррациональных отношений частот (вроде корня 12-й степени из двух, как в равномернотемперированной). Квинта у Пифагора соответствовала отношению частот 3/2. Т. е. высота «до», умноженная на 3/2, — это «соль». Высота «соль», умноженная на 3/2 — это «ре» следующей октавы. И так далее. В итоге круг не замыкается, потому что степень двойки нельзя представить степенью числа 3/2 с рациональным показателем.
        Ответить
        • ебать какой адский матан в моей музычке

          в трех аккордах ничего этого нет
          именно потому я за три аккорда
          Ответить
          • Как всё сложно. В ударных инструментах никаких высот нет, именно поэтому я за барабаны.
            Ответить
          • Угу.

            У струнных инструментов тупо делили струну, как я уже написал. Если струна настроена на условную «до», то зажав струну так, чтобы свободной осталось 2/3 от неё, получим ноту «соль».

            У духовых отверстия прорезали по тому же принципу.
            Ответить

Добавить комментарий

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8