Достыққа балама?

Келесі сценарийде достықтың баламасы бар ма?

Менде UI терезесін білдіретін Window класы бар. Сондай-ақ, singleton ретінде іске қосылған WindowManager класы менің қолданымда барлық терезе нысандарын басқарады (UI көрсетеді, оқиғаларды жібереді және т.б.)

WindowManager құрамында UI оқиғасын жіберу және UI оқиғасын жіберу үшін оның singleton instancing әдісі мен функцияларынан тұратын жалпы интерфейс болады.

Құрылыстың барысында WindowManager тіркелу үшін және жою кезінде тіркеуден шығу үшін Window нысандарын да ұнататынмын. WindowManager :: register және WindowManager :: deregister әдістерін жеке немесе қорғалған болады, себебі клиенттердің ( Window ) осы интерфейсті қолдана алу.

Бұл жағдайда Window және WindowManager арасындағы достықты болдырмау әдісі бар ма? Мүмкін, ұқсас нәтижелерге қол жеткізудің мүлде басқа жолы бар ма?

0
:)) Жоқ, бірақ C ++ бағдарламасының бастамашысы ретінде, мүмкін болмаса да, байланыстыруды болдырмау үшін тым көп тырысамын.
қосылды автор Dan Nestor, көзі
Терезе мен терезе менеджерінің дос болуын қаламайсыз ба? Екеуі бірдей қызды бүгінге қалдырды ма, енді бұл өте ыңғайсыз немесе не?
қосылды автор Keith Irwin, көзі
«Бұл екі нәрсені біріктірудің шынымен де артықшылығы бар ма?» Деген сұрақтарды тоқтатып, өзіңізден сұраңыз. немесе «Мен осы екі бөлікті таза немесе өнімділікке жол берместен олардың арасындағы тәуелділіктер аз болатын жолмен сала аламын ба?» Бірақ егер тәуелділік болса, тәуелділіктің ең таза, ең таза және тікелей алға қарай жасалуы жақсы. Классқа қарап, әлдеқайда нәзік нәрселерге қарап, күрделі байланыстарды жасауға тырысу керек, басқа класстардың олармен байланысты екенін білу әлдеқайда жақсы.
қосылды автор Keith Irwin, көзі

5 жауаптар

Ия, бірақ достық - бұл жақсы шешім, себебі ол осы сценарийге арналған.

Window WindowManager элементін (ескерту, бұл жаңа C ++ 11 қолжетімділік ережелерін қажет етеді) жасау болып табылады. Немесе WindowManager мүшесінен алынады. Немесе оны WindowManager -нен алсаңыз болады.

Сонымен қатар, Window ішіндегі жеке түрін қоюға болады, тек осы жеке түрден жасалуы мүмкін және осы кілт түрінің данасын енгізуді талап ететін Window WindowManager параметріне өтіңіз. Бұл алдын-ала C ++ 11 компиляторларында жұмыс істеуі керек.

Әрине, кез келген тәсіл жеткілікті кастинг әдісімен айналып өтуге болады.

4
қосылды
Мен Window дегенмен ыңғайлы емеспін, WindowManager дегенді білдіреді, себебі оларда «is-a» қатынастары жоқ.
қосылды автор Dan Nestor, көзі
Барлығыңызға рахмет. Достыққа деген сүйіспеншілігіме ұқсайды.
қосылды автор Dan Nestor, көзі
@dandrestor: Мен достық жақсы деп айттым. Бұл басқа әдістер жұмыс істейді, бірақ олар идеалды емес.
қосылды автор Ben Voigt, көзі
@dandrestor: Бұл достық қарым-қатынас жасаған сценарий. Бұл ең жақсы дизайн, кез-келген басқа дизайн қапталған дизайнға әкеледі.
қосылды автор Alok Save, көзі
@Marcin: Проблемалық мәлімдеме Friends дегенді ескере отырып, ең ыңғайлы шешім болып табылады, мен Достыққа ұсынбаймын, себебі ол ең қарапайым әдіс, бірақ ол бұл жағдайда ең қолайлы.
қосылды автор Alok Save, көзі
@ Бұл шынымен мәселеге байланысты. Егер бұл үй тапсырмасы/оқулық болса, онда достық - бұл қысқа және оңай әдіс. Жаттықтырушы кейбір «нақты» GUI құралдарының функционалын модельдеуді қаласа - достықтың бір шектеу бойынша бүліну қаупі бар - ол мұраға жатпайды. IHMO GUI құралдар жиынтығы полиморфизмді жоғары дәрежеде қолданатын жобалар.
қосылды автор Marcin, көзі

Friend кемелерін пайдалану мұнда сәйкес келеді. Сіз достар арқылы дәл көрсетілетін екі сынып арасындағы Қуатты күштеп қосылыс дегенді білдіргіңіз келеді.

Нақтырақ айтқанда, бір сынып басқа класстардың ішкі құрамына кіруді қажет етеді және сіз жалпыға қолжетімділік ерекшелігін пайдаланып, барлығына қол жеткізуді қаламайсыз.

Бақылау ережесі: қоғамдық тым әлсіз және жеке тым күшті болса, сіз қорғалған немесе достарыңызбен таңдалған кірудің кейбір түрін қажет етеді.

Friend пайдалану - ең жақсы шешім.

2
қосылды

Ішкі сыныптарды қолданыңыз.

WindowManager {
  private:
    static void construct();
    static void destruct();
  public:
    class InternalWindow {//can access WindowManager's private members (no scoping needed)
      InternalWindow() { construct(); }
      ~InternalWindow() { desstruct(); }
    };
};

typedef WindowManager::InternalWindow Window;//to make scoping easier
2
қосылды

Тағы бір шешім (қажет емес:) терезені тіркеуді бөлек компонент -не WindowRegister деп айтайын. WindowRegister тіркелу үшін жалпыға ортақ интерфейсі болуы мүмкін және WindowManager-тің жеке мүшесі де болуы мүмкін.

Достықпен байланысты проблемасы - бұл мұраға ие емес (менің джаза досымның досым қажет емес) - терезе немесе WindowManger полиморфты болатындай үлкен мүмкіндік бар.

Құрметпен

2
қосылды
Шынында да, Window полиморфты жасауды жоспарлап отырмын. WindowRegister идеясына кіремін, рахмет!
қосылды автор Dan Nestor, көзі
«Менің досымның жээни - менің досым» туралы не деуге болады? Егер Window WindowManager досын жасасам, Window -тен мұраланған барлық сыныптар өздерін де тіркей алады ма?
қосылды автор Dan Nestor, көзі
А, бұл мағынасы өте жақсы. Рахмет, Кит.
қосылды автор Dan Nestor, көзі
Нысандарды қалай құрастыруға байланысты. Олар өздерінің әдістерінен регистрлерді шақыра алмайды, бірақ олар өздерінің суперкласс әдістерін пайдалана алады. Мәселен, егер, мысалы, қорғалған тіркелімнің өзімнің әдісі терезесі болса, онда олар оны әлі де шақыра алады.
қосылды автор Keith Irwin, көзі

Бірнеше басқа нұсқалар бар. Мысалға:

  • Сілтегіш математика, құрастыру коды және оқу уақытында жеке әдістерге қоңырау шалу үшін жадыдағы сыныптар туралы білімді пайдалана аласыз. Алайда, бұл өте портативті емес.
  • Сіз әдісті жалпыға қол жетімді ете аласыз, бірақ ол терезе сыныбында тұратын жеке кілтпен криптографиялық түрде қол қойылған параметрді қабылдауды талап етеді, осылайша басқа класстар әдісті нақты шақыра алмайды және ол ештеңе істемейді.
  • Сіз әдісті қорғалған және басқа бір мұраны жасай аласыз.
  • Сіз олардың ортақ супер классын жасай аласыз және олардан қорғалған әдістерді пайдаланасыз.
  • Кішкентай қолданылған «жау» кілт сөзін бір-біріңіздің жеке әдістерін орындауға мүмкіндік беру үшін пайдалануға болады, бірақ олар басқа сыныпты айыптайтын шағымдық материал болғанда ғана. (Жақсы, бұл нақты тілдік мүмкіндік емес, бірақ ол болуы керек.)

Немесе оларды достарыңызбен ғана жасай аласыз. Бұл басқа нұсқалардың кез келгеніне қарағанда неғұрлым жеңілірек және саналы, неге достар бар.

1
қосылды
Қандай жағдайға байланысты?
қосылды автор Keith Irwin, көзі
(Ескерту: жоғарыда айтылған түсініктеме C ++-де жаудың кілт сөзі болмағанын айтқан адамға жауап ретінде жасалды.) Оның аты-жөні қалмаған, түсініктемесін алып тастаған.
қосылды автор Keith Irwin, көзі