рд╕реНрдкрдВрджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЕрд╢реБрджреНрдзрддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛



рдореИрдВ рдПрдХ рдЧреЗрдо рдбреЗрд╡рд▓рдкрдореЗрдВрдЯ рдХрдВрдкрдиреА рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдПрдХ рдШрд░реЗрд▓реВ рд╢реМрдХ рдХреЗ рд░реВрдк рдореЗрдВ, рдореБрдЭреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЬрдм рдПрдХ рджреЛрд╕реНрдд рдиреЗ рдореБрдЭреЗ рдлрд╝реНрд▓рдЯрд░ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЛрдмрд╛рдЗрд▓ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рдмреИрдардХ рдореЗрдВ рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛, рддреЛ рдореИрдВ рдЦреБрд╢реА рд╕реЗ рд╕рд╣рдордд рд╣реЛ рдЧрдпрд╛ред рд╡рд╣рд╛рдБ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдореЗрдВ рд╕реНрдкрдВрджрди рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рддрдХрдиреАрдХ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдбрд╛рд░реНрдЯ рдореЗрд░реЗ рд▓рд┐рдП рдЕрдкрд░рд┐рдЪрд┐рдд рдерд╛, рдЕрдирд┐рд╡рд╛рд░реНрдп рдХрд╛рд░реНрдпрдХреНрд░рдо рдореЗрдВ рднрд╛рд╖рд╛ рд╕реАрдЦрдирд╛ рднреА рд╢рд╛рдорд┐рд▓ рдерд╛ред рдХреЛрдб рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдкрд░ рдереЛрдбрд╝рд╛ рдмреИрдардиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдбрд╛рд░реНрдЯ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рдордЭрдиреЗ рд╡рд╛рд▓реА рдФрд░ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рднрд╛рд╖рд╛ рдкрд╛рдИ, рдЬреЛ рдореБрдЭреЗ рдмрд╣реБрдд рдкрд╕рдВрдж рдереАред рдбрд╛рд░реНрдЯ рдХреА рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдЬреЛ рдореБрдЭреЗ рдкрд╕рдВрдж рдереА рд╡рд╣ рд╣реИ рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБред

рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБ рдХреНрдпрд╛ рд╣реИрдВ?


рдПрдХ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдЪрд┐рдд рдХреЗ рд▓рд┐рдП, рдореИрдВ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рд╕реЗ рдПрдХ рдЙрджреНрдзрд░рдг рджреВрдВрдЧрд╛ред
рдкреНрд░рд╡реЗрд╢ (рдЕрдВрдЧреНрд░реЗрдЬреА рдорд┐рд╢реНрд░рдг) рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ (рдЖрдорддреМрд░ рдкрд░ рдПрдХ рд╡рд░реНрдЧ рдпрд╛ рдореЙрдбреНрдпреВрд▓) рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИ рдЬреЛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рдирд╣реАрдВ рд╣реИред
рдбрд╛рд░реНрдЯ рдореЗрдВ, рдЗрд╕ рддрд░рд╣ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдирд╛рдо рд╕реЗ рдкрд╣рд▓реЗ рдорд┐рдХреНрд╕рд┐рди рд╢рдмреНрдж рджреНрд╡рд╛рд░рд╛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЙрдкрд░реЛрдХреНрдд рдкрд░рд┐рднрд╛рд╖рд╛ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдореЗрдВ рддрд╛рд░реНрдХрд┐рдХ рд░реВрдк рд╕реЗ рдЕрд▓рдЧ-рдерд▓рдЧ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдорд┐рд▓рддреА рд╣реИ рдЬрд┐рд╕реЗ рдЕрдиреНрдп рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рдпрд╣ рдЖрдкрдХреЛ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдХреА рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ? рд╣рд╛рдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрд╢реБрджреНрдзрддрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдмреЗрд╣рддрд░ рд╣реИред рдФрд░ рдХреНрдпреЛрдВ, рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЕрдореВрд░реНрдд рд╡рд░реНрдЧ рдкрд╢реБ рд╣реИред

abstract class Animal { void voice(); } 

рдФрд░ рдХреИрдЯ рдФрд░ рдбреЙрдЧ рдХреНрд▓рд╛рд╕ рднреА рд╣реИрдВ рдЬреЛ рдПрдирд┐рдорд▓ рдХреНрд▓рд╛рд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 class Cat extends Animal { void voice() { print(тАЬMeowтАЭ); } } class Dog extends Animal { void voice() { print(тАЬWoofтАЭ); } } 

рдФрд░ рдлрд┐рд░ рд╣рдореЗрдВ рдЕрдЪрд╛рдирдХ рдЬрд░реВрд░рдд рдкрдбрд╝реА ...
CatDog

рд╣рд╛рдВ, рд╣рд╛рдВ, рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдореЗрд░реЗ рдкрд╛рд╕ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдРрд╕реА рдЪреАрдЬреЗрдВ рдирд╣реАрдВ рд╣реИрдВред

рдФрд░ рдХрдИ рдЙрддреНрддрд░рд╛рдзрд┐рдХрд╛рд░ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рднреА рдРрд╕рд╛ рд╣реА рдХрд░реЗрдВрдЧреЗред

 class CatDog extends Cat, Dog { } 

рд▓реЗрдХрд┐рди рдЬреИрд╕реЗ рд╣реА рд╣рдо рдЕрдкрдиреЗ рд╡реЙрдпрд╕ рдХрдорд╛рдВрдб рдХреЛ рдЕрдкрдиреЗ рдкрд╛рд▓рддреВ рдЬрд╛рдирд╡рд░ рдХреЛ рдЖрд╡рд╛рдЬ рджреЗрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ рдмрд╣реБрдд рдЕрдкреНрд░рд┐рдп рд╕реНрдерд┐рддрд┐ рдорд┐рд▓рддреА рд╣реИ - рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрд╕реЗ рдХреНрдпрд╛ рдЬрд╡рд╛рдм рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рджреЛрдиреЛрдВ рд╡рд░реНрдЧреЛрдВ рдореЗрдВ рдЖрд╡рд╛рдЬ рдХреА рд╡рд┐рдзрд┐ рд▓рд╛рдЧреВ рд╣реИред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдХреЛ рд╡реНрдпрд╛рдкрдХ рд░реВрдк рд╕реЗ рдЬрд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣реАрд░реЗ рдХреА рд╕рдорд╕реНрдпрд╛ рдпрд╛ рдбреЗрдбрд▓реА рдбрд╛рдпрдордВрдб рдСрдлрд╝ рдбреЗрде рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ ред

рдореМрдд рдХрд╛ рдШрд╛рддрдХ рд╣реАрд░рд╛

рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмрд┐рдХреНрд░реА рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

 lass Animal { void voice() { print(тАЬHakuna Matata!тАЭ); } } mixin Cat { void voice() { print(тАЬMeowтАЭ); } } mixin Dog { void voice() { print(тАЬWoofтАЭ); } } class CatDog extends Animal with Cat, Dog { } 

рдФрд░ рдЕрдЧрд░ рд╣рдо рдЕрдм рд╡реЙрдпрд╕ рдХрдорд╛рдВрдб рджреЗрдВрдЧреЗ рддреЛ рд╣рдо рдХреНрдпрд╛ рд╕реБрдиреЗрдВрдЧреЗ? рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ - Woof, рдФрд░ рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЪреБрдХреЗ рд╣реИрдВ, рдпрд╣ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рдХреНрд░рдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдирдХрд╛ рдЬреЛрдбрд╝ рд╕рдорд╛рдирд╛рдВрддрд░ рдирд╣реАрдВ рд╣реЛрддрд╛, рд▓реЗрдХрд┐рди рдЕрдиреБрдХреНрд░рдорд┐рдХ рд╣реЛрддрд╛ рд╣реИред

рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбрд╛рд░реНрдЯ 2.1 рдореЗрдВ рд╢реБрд░реВ рдХреА рдЧрдИ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╢реБ рд╡рд░реНрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ, рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрди рдХрдХреНрд╖рд╛рдУрдВ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред рд╕рдВрд╕реНрдХрд░рдг 2.1 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░ рд╡рд╛рд░рд┐рд╕реЛрдВ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╣ рддрдВрддреНрд░ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рддрд╛ рд╣реИ, рдЬреЛ рдХреЛрдб рджреЛрд╣рд░рд╛рд╡ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред

 abstract class Sportsman { void readySteadyGo(); } mixin SkiRunner { void run() { print(тАЬSki, ski, skiтАЭ); } } mixin RifleShooter { void shot() { print(тАЬPew, pew, pewтАЭ); } } class Shooter() extends Sportsman with RifleShooter { void readySteadyGo() { shot(); } } class Skier() extends Sportsman with SkiRunner { void readySteadyGo() { run(); } } class Biathlete() extends Sportsman with SkiRunner, RifleShooter { void readySteadyGo() { run(); shot(); } } 

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдордиреЗ рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рднреА рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХреЛрдб рд╡рд┐рддрд░рд┐рдд рдХрд┐рдП рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд▓реЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдЙрддреНрдкрдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ рдЬрдм рдХрд┐рд╕реА рднреА рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рд╕рднреА рд╡рд░реНрдЧреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╢рд╛рдорд┐рд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдФрд░ рдПрдХ рддрдВрддреНрд░ рдЬреЛ рд╣рдореЗрдВ рдЗрди рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рд╡рд╣ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИред рдпрд╣ рдХрдХреНрд╖рд╛ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд░рд╡реЗрд╢ рдШреЛрд╖рдгрд╛ рдореЗрдВ рдХреАрд╡рд░реНрдб рдкрд░ рд╣реИред рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдЙрди рд╡рд░реНрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВрдЧреЗ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдпрд╛ рдЙрд╕рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВред

рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:

 class A { } abstract class B { } mixin M1 on A { } mixin M2 on B { } 

рдлрд┐рд░ рд╣рдо рд╕рдорд╛рди рд╡рд░реНрдЧреЛрдВ рдХреА рдШреЛрд╖рдгрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

 class C extends A with M1 { } class D implements B with M2 { } 

рд▓реЗрдХрд┐рди рд╣рдореЗрдВ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреБрдЫ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ:
 class E with M1, M2 { } 

рд╕реНрдкрдВрджрди рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ


рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдЕрд╢реБрджреНрдзрд┐рдпрд╛рдБ рдЖрдкрдХреЛ рдХреЛрдб рдХреЗ рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдЫреБрдЯрдХрд╛рд░рд╛ рдкрд╛рдиреЗ рдФрд░ рдЕрд▓рдЧ-рдЕрд▓рдЧ рддрд╛рд░реНрдХрд┐рдХ рднрд╛рдЧреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рд╕реНрдкрдВрджрди рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рд▓рд╛рдЧреВ рд╣реЛрддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдкрд░рдорд╛рдгреБ рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рд╡рд┐рдЬреЗрдЯ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рд╣реИ рдЬреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ? рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВрдиреЗ рддреБрд░рдВрдд рдПрдХ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдХреА рдХрд▓реНрдкрдирд╛ рдХреА рдЬрд┐рд╕рдореЗрдВ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрдИ рд╡рд┐рдЬреЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛрддрд╛ рд╣реИред рдореИрдВ рдмреАрдПрд▓рдУрд╕реА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реВрдВрдЧрд╛ рдФрд░ рдЖрд░рдПрдХреНрд╕рдбрд╛рд░реНрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕рдВрд╕реНрдерд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред

рдкреНрд░рд╡рд╛рд╣ рдирд┐рдпрдВрддреНрд░рдХ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

 /// Interface for disposable objects abstract class Disposable { void dispose(); } 

рдПрдХ рдкреНрд░рд╡реЗрд╢рдкрддреНрд░ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рд░рд╛рдЬреНрдп рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред

 /// Mixin for object which support state mixin StateProvider implements Disposable { static const NONE_STATE = "None"; final _stateController = BehaviorSubject<String>(seedValue: NONE_STATE); Observable<String> get stateOut => _stateController.stream; String get currentState => _stateController.value; void setState(String state) { _stateController.sink.add(state); } @override void dispose() { _stateController.close(); } } 

рддрд╛рд░реНрдХрд┐рдХ рднрд╛рдЧ рдЬреЛ рд╡рд┐рдЬреЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдЙрд╕реЗ рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рджреЗрдВ рдФрд░ 3 рд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдЗрд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рдмрджрд▓ рджреЗрдВред

 /// Example BLoC class ExampleBloc implements Disposable with StateProvider { static const EXAMPLE_STATE_1 = "EX1"; static const EXAMPLE_STATE_2 = "EX2"; Timer _timer; void init() { setState(EXAMPLE_STATE_1); _timer = new Timer(const Duration(seconds: 3), () { _timer = null; setState(EXAMPLE_STATE_2); }); } @override void dispose() { if (_timer != null) { _timer.cancel(); _timer = null; } } } 

рдФрд░ рд╡рд┐рдЬреЗрдЯ рд╣реА рд╣реИ рдХрд┐ рдПрдХ рд░рд╛рдЬреНрдп рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдВрдЧреЗред рдирд┐рд░реНрднрд░рддрд╛ рдЗрдВрдЬреЗрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рддрд╛рд░реНрдХрд┐рдХ рдШрдЯрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВред

 class ExampleWidget extends StatelessWidget { final bloc = di<HomePageBloc>(); @override Widget build(BuildContext context) { return StreamBuilder( stream: bloc.stateOut, builder: (BuildContext context, AsyncSnapshot<String> snapshot) { // build widget by state }, ); } } 

рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ рд╣рдо рдЙрд╕ рдорд┐рд╢реНрд░рдг рдореЗрдВ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд┐рд▓реНрдбрд░ рд╡рд┐рдзрд┐ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдРрд╕реЗ рдХрдИ рд╕рд░рд▓ рд╡рд┐рдЬреЗрдЯ рд╣реЛрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рд┐рд░реНрдл рдПрдХ рдЙрджрд╛рд╣рд░рдг рдерд╛ред рдлрд┐рд░ рднреА, рд░рд╛рдЬреНрдп рд╕рдорд░реНрдерди рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд╛ рддрд╛рд░реНрдХрд┐рдХ рд╣рд┐рд╕реНрд╕рд╛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕ рдкреНрд░рд╡реЗрд╢ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рдмреАрдПрд▓рдУрд╕реА рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛рдПрдЧрд╛ред

рдирд┐рд╖реНрдХрд░реНрд╖


рдЕрд╢реБрджреНрдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рддрдВрддреНрд░ рдореБрдЭреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рд▓рдЪреАрд▓рд╛ рд╡рд┐рдХрд╛рд╕ рдЙрдкрдХрд░рдг рд▓рдЧрддрд╛ рдерд╛, рдЬреЛ рдПрдХ рд╕рд░рд▓, рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред рдЦреБрдж рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореЗрд░реА рдХрд┐рдЯ рдореЗрдВ рдпрд╣ рдЙрдкрдХрд░рдг рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╢рд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЗ рд▓рд┐рдП рднреА рдЙрдкрдпреЛрдЧреА рд╣реЛрдЧрд╛ред

рд╕рдВрд╕рд╛рдзрди:
рдбрд╛рд░реНрдЯ рднрд╛рд╖рд╛ рдХрд╛ рдПрдХ рджреМрд░рд╛
рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛

Source: https://habr.com/ru/post/hi467143/


All Articles