Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Варианты используются для задания правил совместимости интерфейсов.
- //
- // - Ковариантные интерфейсы могут иметь только возвращаемые типы (return type) (модификатор out).
- // - Это всегда Upcast (напр. если возвращаемый тип BasicTank, то все производные типы (MediumTank,HeavyTank) будут приведены к BasicTank)
- // - Контрвариантные интерфейсы могут иметь только входящие параметры. (модификатор in)
- // - Контравариантность - это способность использовать менее конкретный тип, чем заданный изначально.
- // - Это всегда Downcast (напр. если тип принимаемого параметра BasicAirplane, то в туда можно подставить все наследуемые типы (JetAirplane,StealthAirplane))
- // Пример. Имеются фабрики по производству танков и самолетов.
- public interface IMilitaryFactory<in TBlueprint, out TProduct>
- {
- public TProduct Produce(TBlueprint blueprint);
- }
- // Blueprints hierarchy
- public class SimpleBlueprint { }
- public class AdvancedBlueprint : SimpleBlueprint { }
- // Basic war machine
- public class WarMachine { }
- // Tanks hierarchy
- public class BasicTank : WarMachine { }
- public class MediumTank : BasicTank { }
- public class HeavyTank : MediumTank { }
- // Airplane hierarchy
- public class BasicAirplane : WarMachine { }
- public class JetAirplane : BasicAirplane { }
- public class StealthAirplane : JetAirplane { }
- //
- public class AllTanksFactory : IMilitaryFactory<SimpleBlueprint, BasicTank>
- {
- // Метод может принять ВСЕ типы чертежа - SimpleBlueprint и AdvancedBlueprint
- public BasicTank Produce(SimpleBlueprint blueprint)
- {
- // Метод может вернуть любой тип танка от LightTank и до HeavyTank
- return null;
- }
- }
- public class OnlyHeavyTanksFactory : IMilitaryFactory<AdvancedBlueprint, HeavyTank>
- {
- // Метод может принять ТОЛЬКО AdvancedBlueprint
- public HeavyTank Produce(AdvancedBlueprint blueprint)
- {
- // Метод может вернуть ТОЛЬКО экземпляр класса HeavyTank и его производные
- return null;
- }
- }
- public class AllAirplaneFactory : IMilitaryFactory<SimpleBlueprint, BasicAirplane>
- {
- // Метод может принять ВСЕ типы чертежа - SimpleBlueprint и AdvancedBlueprint
- public BasicAirplane Produce(SimpleBlueprint blueprint)
- {
- // Метод может вернуть любой экземпляр класса начиная от BasicAirplane и до StealthAirplane
- return null;
- }
- }
- public class ExceptBasicAirplaneFactory : IMilitaryFactory<AdvancedBlueprint, JetAirplane>
- {
- // Метод может принять ТОЛЬКО AdvancedBlueprint
- public JetAirplane Produce(AdvancedBlueprint blueprint)
- {
- // Метод может вернуть ТОЛЬКО экземпляр класса JetAirplane и его производные, то есть StealthAirplane.
- return null;
- }
- }
- //
- public class GameManager
- {
- private IMilitaryFactory<SimpleBlueprint, BasicTank> _allTankFactory = new AllTanksFactory();
- private IMilitaryFactory<AdvancedBlueprint, HeavyTank> _onlyHeavyTankFactory = new OnlyHeavyTanksFactory();
- private IMilitaryFactory<SimpleBlueprint, BasicAirplane> _allAirplaneFactory = new AllAirplaneFactory();
- private IMilitaryFactory<AdvancedBlueprint, JetAirplane> _exceptBasicAirplaneFactory = new ExceptBasicAirplaneFactory();
- public GameManager()
- {
- ProduceWarMachine(_allTankFactory);
- ProduceWarMachine(_onlyHeavyTankFactory);
- ProduceWarMachine(_allAirplaneFactory);
- ProduceWarMachine(_exceptBasicAirplaneFactory);
- }
- public void ProduceWarMachine(IMilitaryFactory<AdvancedBlueprint, WarMachine> factory)
- {
- WarMachine machine = factory.Produce(new AdvancedBlueprint());
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement