.NET рдореЗрдВ рд▓рд┐рдВрдХрд░ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреИрд╕реЗ рдХрд░реЗрдВ


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

рдиреАрдЪреЗ рдореИрдВ C # рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ, рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдЕрдкрдиреЗ рд╕рдорд╛рдзрд╛рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рджреВрдВрдЧрд╛ред


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



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

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

using System.Collections.Generic;
using System.Diagnostics.Contracts;
namespace ComponentLibrary
{
[ContractClass( typeof (IComponentContract))]
public interface IComponent< out TComponent, out TChildrenCollection>
where TComponent : IComponent<TComponent, TChildrenCollection>
where TChildrenCollection : class , IEnumerable <TComponent>
{
TChildrenCollection Children { get ; }
bool IsComposite { get ; }
}
}


* This source code was highlighted with Source Code Highlighter .

рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЯреЗрдореНрдкрд▓реЗрдЯ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпреЛрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ? рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ: рдЬрд╣рд╛рдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рдХрд╛рд░ рдЕрднреА рддрдХ рдЬреНрдЮрд╛рдд рдирд╣реАрдВ рд╣реИрдВ, рд╡рд╣рд╛рдВ рдордЬрдмреВрдд рдЯрд╛рдЗрдкрд┐рдВрдЧ рд▓рд╛рдПрдВред

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

TChildrenCollection рд╕рдВрдЧреНрд░рд╣ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдмрдЪреНрдЪреЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреЗрд╡рд▓ GetEnumerator () рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрдк рд╕рдВрдЧреНрд░рд╣ рд╕реВрдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдХрднреА-рдХрднреА рдРрдб () рдФрд░ рдирд┐рдХрд╛рд▓реЗрдВ () рдЬреИрд╕реЗ рддрд░реАрдХреЛрдВ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рднреА рддрддреНрд╡реЛрдВ рдХреЛ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░ рдореЗрдВ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдорд┐рдд рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╕реНрд╡рдпрдВ рдирд┐рд░реНрдорд╛рдг рдХреЗ рдмрд╛рдж рдирд╣реАрдВ рдмрджрд▓рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдФрд░ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЕрдЪрд╛рдирдХ рдПрдХ рд╕рдВрдЧреНрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрдирд╛рдУрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдПрдХ рдкрд░реНрдпрд╡реЗрдХреНрд╖рдХ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ <TComponent> рдПрдХ TChildrenCollection рдХреЗ рд░реВрдк рдореЗрдВ, рдФрд░ рдпрд╣ рд╕рдм рдЯреЛрдкреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ!

рдкреНрд░рдХрд╛рд░ рдХреЗ рдЕрдиреБрдмрдВрдз рдореЗрдВ, рд╣рдо рдмрдЪреНрдЪреЛрдВ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╡рд╛рдкрд╕реА рдореВрд▓реНрдп рдкрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ: 1) рд▓реМрдЯрд╛ рд╕рдВрдЧреНрд░рд╣ рд╢реВрдиреНрдп рдирд╣реАрдВ рд╣реИ; 2) рдЗрд╕рдХрд╛ рдХреЛрдИ рднреА рддрддреНрд╡ рдЕрд╢рдХреНрдд рдирд╣реАрдВ рд╣реИ; 3) рдШрдЯрдХ рдпрд╛ рддреЛ рд╕рдордЧреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ рдпрд╛ рдЗрд╕рдореЗрдВ рдмрд╛рд▓ рддрддреНрд╡ рдирд╣реАрдВ рд╣реИрдВред рд╕рдВрдХреНрд╖рд┐рдкреНрддрддрд╛ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрдмрдВрдз рдХреЛрдб рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдордиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рдзрд┐ рджреЗрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ рдЬреЛ рдПрдХ рдкреБрдирд░рд╛рд╡реГрддрд┐ рджреЗрддрд╛ рд╣реИ рдЬреЛ рдЬрдЯрд┐рд▓ рд╕рдмрдЯреНрд░реА рдЯреНрд░реИрд╡рд░реНрд╕рд▓ рд▓реЙрдЬрд┐рдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ? рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдордиреЗ рдРрд╕рд╛ рдЗрдЯрд░реЗрдЯрд░ рд▓рд┐рдЦрд╛ рд╣реИ, ComponentDescendantsEnumerator <TComponent> (рдЗрд╕рдХрд╛ рдХреЛрдб рд▓реЗрдЦ рдХреЗ рдЕрдВрдд рдореЗрдВ рд▓рд┐рдВрдХ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рдХреНрд▓рд╛рд╕ ComponentDescendantsEnumerable <TComponent> рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛, рдЬреЛ IEnumerable <TComponent> рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рддрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╕рдорд╛рди рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХрд╣рд╛рдБ рд░рдЦреЗрдВ? рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рд╕реА # рдореЗрдВ рдПрдХ рдмрд╣реБрдд рд╣реА рдЙрдкрдпреЛрдЧреА рддрдВрддреНрд░ рд╣реИ - рд╡рд┐рд╕реНрддрд╛рд░ рдХреЗ рддрд░реАрдХреЗред рдЖрдЗрдП рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред

namespace ComponentLibrary.Extensions
{
public static class ComponentExtensions
{
public static IEnumerable <T> GetDescendants<T>( this T component)
where T : IComponent<T, IEnumerable <T>>
{
//
return new ComponentDescendantsEnumerable<T>(component);
}
}
}


* This source code was highlighted with Source Code Highlighter .

рд╣рдо рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдирд╛рдорд╕реНрдерд╛рди рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ - рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рдЗрд╕реЗ IComponent <,> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрдм рд╣рдо рдЗрд╕ рдирд╛рдо рд╕реНрдерд╛рди рдХреЛ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдФрд░ рдХрд╛рд░реНрдп рд╣реИ: рд╣рдореЗрдВ рдЙрди рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдХрднреА рднреА рддрддреНрд╡ рд╢рд╛рдорд┐рд▓ рди рд╣реЛрдВ, рдФрд░ рд╕рднреА рдкрд░рд┐рд╡рд░реНрддрди рдЕрдиреБрд░реЛрдзреЛрдВ (рдЬреИрд╕реЗ рдЬреЛрдбрд╝реЗрдВ / рдирд┐рдХрд╛рд▓реЗрдВ) рдкрд░ NotSupportedException рдХреЛ рдлреЗрдВрдХ рджреЗрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдРрд╕рд╛ рд╕рдВрдЧреНрд░рд╣ рдмрдирд╛рдПрдВ рдЬреЛ ICollection <T> рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрджрд┐ рдХреЛрдИ рд╕рдВрдЧреНрд░рд╣ рдХрднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИ рдФрд░ рд╣рдореЗрд╢рд╛ рдЦрд╛рд▓реА рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдкреВрд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП (рдпрд╛ рдмрд▓реНрдХрд┐, AppDomain рдкрд░) рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрдЧреНрд░рд╣ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИред рд╕рд┐рдВрдЧрд▓рдЯрди рдкреИрдЯрд░реНрди рдХрд╛ рд▓рд╛рдн рд▓реЗрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрджрд░реНрд╢ рдорд╛рдорд▓рд╛! (рд╕рд┐рдВрдЧреНрд▓рдЯрди <рдЯреА> рд╡рд░реНрдЧ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕рдВрд▓рдЧреНрди рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)

sealed internal class ItemsNotSupportedCollection<T> :
Singleton<ItemsNotSupportedCollection<T>>,
ICollection<T>
{
private ItemsNotSupportedCollection() { }

public int Count { get { return 0; } }

public bool IsReadOnly { get { return true ; } }

public bool Contains(T item) { return false ; }

public void CopyTo(T[] array, int arrayIndex) { }

public void Add(T item) { throw new NotSupportedException(); }

public void Clear() { throw new NotSupportedException(); }

public bool Remove(T item) { throw new NotSupportedException(); }

public IEnumerator<T> GetEnumerator()
{
return ItemsNotSupportedEnumerator<T>.Instance;
}

IEnumerator IEnumerable .GetEnumerator()
{ return this .GetEnumerator(); }
}


* This source code was highlighted with Source Code Highlighter .

рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рд▓рд┐рдП, рдкреНрд░рдпреБрдХреНрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рд╡рд░реНрдЧ рдПрдХ рдЦрд╛рд▓реА рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рднреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ - рдлрд┐рд░ рд╕реЗ рдПрдХ рд╕рд┐рдВрдЧрд▓рдЯрдиред

sealed internal class ItemsNotSupportedEnumerator<T> :
Singleton<ItemsNotSupportedEnumerator<T>>,
IEnumerator<T>
{
private ItemsNotSupportedEnumerator() { }

public T Current { get { return default (T); } }

public void Dispose() { }

object IEnumerator.Current { get { return null ; } }

public bool MoveNext() { return false ; }

public void Reset() { throw new NotSupportedException(); }
}


* This source code was highlighted with Source Code Highlighter .

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдерд┐рд░ рд╕рдВрдкрддреНрддрд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ рдЬреЛ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ рдФрд░ ICollection <T> рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рддрддреНрд╡реЛрдВ рдХрд╛ рдХреЗрд╡рд▓-рдкрдарди рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддреА рд╣реИред

public static class ComponentCollections<TComponent>
where TComponent : IComponent<TComponent, IEnumerable <TComponent>>
{
public static ICollection<TComponent> EmptyCollection
{
get
{
//
return ItemsNotSupportedCollection<TComponent>.Instance;
}
}
}


* This source code was highlighted with Source Code Highlighter .

рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рд╕рдордп рдЖ рдЧрдпрд╛ рд╣реИ: рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡рд░реНрдЧ рдкрджрд╛рдиреБрдХреНрд░рдо рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдорд┐рдиреА-рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рдЖрдк рдПрдХ рдореЗрдиреВ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: MenuCommand - рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрдорд╛рдВрдб рдФрд░ рдореЗрдиреВ - рдПрдХ рд╕рдмрдореЗрдиреВ рдЬрд┐рд╕рдореЗрдВ рдЕрдиреНрдп рдХрдорд╛рдВрдб рдФрд░ рд╕рдмрдореЗрдирд╕ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рд╕рднреА рд╡рд░реНрдЧ рдПрдХ рдЕрд▓рдЧ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИрдВред рдЫрдареА рдЗрдВрджреНрд░реА рдмрддрд╛рддреА рд╣реИ рдХрд┐ "рд▓рд┐рдВрдХрд░" рдкреИрдЯрд░реНрди рдпрд╣рд╛рдБ рдХрд╛рдо рдЖрдПрдЧрд╛ред



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



namespace MenuLibrary
{
public interface IMenuItem :
IComponent<IMenuItem, ICollection<IMenuItem>>
{
string Name { get ; }
void Display( int indent = 0);
}
}


* This source code was highlighted with Source Code Highlighter .

рдПрдХ TComponent рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдо рд╣рдореЗрд╢рд╛ рдШрдЯрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЕрд░реНрдерд╛рдд, рд╕рдорд╛рди IMenuItem) рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, TChildrenCollection, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВред рд╣рдо TChildrenCollection рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдХрд┐ рдкреИрдЯрд░реНрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд░реВрдк рдореЗрдВ Add, Remove, рдФрд░ GetChild рддрд░реАрдХреЗ (рд╕рд╛рде рд╣реА GetEnumerator) рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП IList <IMenuItem> рдкрд╛рд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣рд╛рдВ рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ ICollection <IMenuItem> рд╣рдореЗрдВ рд╕реВрдЯ рдХрд░рддрд╛ рд╣реИред

рдпрд╣ рд╣реИ рдХрд┐ рд╣рдо MenuCommand рдкрддреНрддреА рдШрдЯрдХ рдХреЛ рдХреИрд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

public class MenuCommand : IMenuItem
{
private readonly string name;

public MenuCommand( string name)
{
//
this .name = name;
}

public string Name { get { return this .name; } }

public void Display( int indent = 0)
{
string indentString = MenuHelper.GetIndentString(indent);
Console .WriteLine( "{1}{0} [Command]" , this .name, indentString);
}

public ICollection<IMenuItem> Children
{
get { return ComponentCollections<IMenuItem>.EmptyCollection; }
}

public bool IsComposite { get { return false ; } }
}


* This source code was highlighted with Source Code Highlighter .

рдмрдЪреНрдЪреЛрдВ рдХреА рд╕рдВрдкрддреНрддрд┐ рдкрддреНрддреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдШреЛрд╖рд┐рдд "рд╕рд┐рдВрдЧрд▓рдЯрди" рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддреА рд╣реИред рдЕрдм рдХрдВрдкреЛрдЬрд┐рдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдиреНрдпреВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред

public class Menu : IMenuItem
{
private readonly ICollection<IMenuItem> children =
new List <IMenuItem>();

private readonly string name;

public Menu( string name)
{
//
this .name = name;
}

public string Name { get { return this .name; } }

public void Display( int indent = 0)
{
string indentString = MenuHelper.GetIndentString(indent);
Console .WriteLine( "{1}{0} [Menu]" , this .name, indentString);
int childrenIndent = indent + 1;
foreach (IMenuItem child in this .children)
{
child.Display(childrenIndent);
}
}

public ICollection<IMenuItem> Children
{ get { return this .children; } }

public bool IsComposite { get { return true ; } }
}


* This source code was highlighted with Source Code Highlighter .

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

рдЕрдм рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдХреЛрдб рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред

using System;
using System.Linq;
using ComponentLibrary.Extensions;
using MenuLibrary;
namespace MenuTest
{
public static class MenuTest
{
public static void Perform()
{
//
IMenuItem rootMenu = new Menu( "Root" );
// ... File
IMenuItem fileMenu = new Menu( "File" );
fileMenu.Children.Add( new MenuCommand( "New" ));
fileMenu.Children.Add( new MenuCommand( "Open" ));
// ... File->Export
IMenuItem fileExportMenu = new Menu( "Export" );
fileExportMenu.Children.Add( new MenuCommand( "Text Document" ));
fileExportMenu.Children.Add( new MenuCommand( "Binary Format" ));
fileMenu.Children.Add(fileExportMenu);
// ... File
fileMenu.Children.Add( new MenuCommand( "Exit" ));
rootMenu.Children.Add(fileMenu);
// ... Edit
IMenuItem editMenu = new Menu( "Edit" );
editMenu.Children.Add( new MenuCommand( "Cut" ));
editMenu.Children.Add( new MenuCommand( "Copy" ));
editMenu.Children.Add( new MenuCommand( "Paste" ));
rootMenu.Children.Add(editMenu);
//
rootMenu.Display();
Console .WriteLine();
// ,
// Root, "E" "R"
var compositeMenuNames =
from menu in rootMenu.GetDescendants()
where menu.IsComposite
&& (menu.Name.StartsWith( "E" ) || menu.Name.StartsWith( "R" ))
select menu.Name;
foreach ( string menuName in compositeMenuNames)
{
Console .WriteLine(menuName);
}
}
}
}


* This source code was highlighted with Source Code Highlighter .

GetDescendants () рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП LINQ рдХреНрд╡реЗрд░реА рдкрд░ рдзреНрдпрд╛рди рджреЗрдВред рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВред



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

рд╕реВрддреНрд░реЛрдВ рдХрд╛ рд▓рд┐рдВрдХ: http://www.fileden.com/files/2011/10/7/3205975/ComponentLibrary.zip

PS рдпрджрд┐ рдЖрдкрдХреЛ рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧ рд░рд╣рд╛ рдерд╛, рдпрд╛ рдЖрдк рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд▓реНрдк рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЙрд╕реА рдкреЛрд╕реНрдЯ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрд▓реНрд▓реЗрдЦ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкреАрдкреАрдПрд╕ рдИрдорд╛рдирджрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рдореЗрд░реЗ рд╕рд╛рде рд▓рд┐рдВрдХрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдмреЗрд╣рддрд░ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрдЧрд╛ред

рдпреВрдкреАрдбреА рдЬреИрд╕рд╛ рдХрд┐ рдПрд╡рд▓реНрдЯрд░ рдиреЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рд╣реИ, рдпрд╣рд╛рдВ рдореИрдВрдиреЗ рд╕рд┐рд░реНрдл рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдЗрдВрдЯрд░рдлреЗрд╕, рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдЯреВ рдж рд▓рд┐рдВрдХрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ NullObject рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ (рдпрд╣ рдПрдХреНрд╕рдЯреНрд░реЗрдХреНрдЯ рдХреНрд▓рд╛рд╕ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд▓рд╛рд╣ рджреА рдЬрд╛рддреА рд╣реИ, рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рдордЧреНрд░ рдШрдЯрдХреЛрдВ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рдЕрд▓рдЧ рд╡рд░реНрдЧ рдореЗрдВ рдПрдирдХреИрдкреНрд╕реБрд▓реЗрдЯ рдХрд░реЗрдВ)ред рдкрд░рд┐рдгрд╛рдо рд╕рд┐рд░реНрдл рдПрдХ рд▓рд┐рдВрдХрд░ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рдПрдХ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛ рд╕рдВрд░рдЪрдирд╛ рд╣реИред

рдореИрдВ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдкреИрдЯрд░реНрди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реВрдВ! рд▓реЗрдХрд┐рди рдЖрдк рдШрдЯрдХ рдШрдЯрдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛрдб рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЗрд╕реЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдкрддреНрддреА рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░-рдирд▓-рд╡рд╕реНрддреБ рд╕рдВрдЧреНрд░рд╣, рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдФрд░ IComponent рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдмрдВрдз, рдЬреЛ рдпрд╣рд╛рдВ рд╕реЗ рдЧреБрдЬрд░рдиреЗ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдЬрдм IMenuItem рдХреЗ рд╕рдорд╛рди рдПрдХ рдФрд░ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдкреНрд░рджрд░реНрд╢рди () рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рддрд░реНрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯрд▓рд╛рдЗрдВрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рд╕рдВрд░рдЪрдирд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ (рдЕрдиреНрдпрдерд╛ рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ)ред

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


All Articles