[{"data":1,"prerenderedAt":1642},["ShallowReactive",2],{"navigation_docs":3,"-tu-hoc-oop-cau-hoi-phong-van":420,"-tu-hoc-oop-cau-hoi-phong-van-surround":1637},[4,153],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":26},"Phỏng vấn .NET","i-lucide-briefcase","\u002Fphong-van","1.phong-van",[10,27,66,111,128],{"title":11,"icon":12,"path":13,"stem":14,"children":15,"page":26},"Tổng quan","i-lucide-compass","\u002Fphong-van\u002Ftong-quan","1.phong-van\u002F1.tong-quan",[16,21],{"title":17,"path":18,"stem":19,"icon":20},"Thị trường HCM","\u002Fphong-van\u002Ftong-quan\u002Fthi-truong","1.phong-van\u002F1.tong-quan\u002F1.thi-truong","i-lucide-trending-up",{"title":22,"path":23,"stem":24,"icon":25},"Lộ trình 7 ngày","\u002Fphong-van\u002Ftong-quan\u002Flo-trinh","1.phong-van\u002F1.tong-quan\u002F2.lo-trinh","i-lucide-calendar-days",false,{"title":22,"icon":25,"path":28,"stem":29,"children":30,"page":26},"\u002Fphong-van\u002Flo-trinh","1.phong-van\u002F2.lo-trinh",[31,36,41,46,51,56,61],{"title":32,"path":33,"stem":34,"icon":35},"Ngày 1 — C# cơ bản","\u002Fphong-van\u002Flo-trinh\u002Fngay-1-csharp-co-ban","1.phong-van\u002F2.lo-trinh\u002F1.ngay-1-csharp-co-ban","i-lucide-1",{"title":37,"path":38,"stem":39,"icon":40},"Ngày 2 — OOP và SOLID","\u002Fphong-van\u002Flo-trinh\u002Fngay-2-oop-solid","1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid","i-lucide-2",{"title":42,"path":43,"stem":44,"icon":45},"Ngày 3 — C# nâng cao","\u002Fphong-van\u002Flo-trinh\u002Fngay-3-csharp-nang-cao","1.phong-van\u002F2.lo-trinh\u002F3.ngay-3-csharp-nang-cao","i-lucide-3",{"title":47,"path":48,"stem":49,"icon":50},"Ngày 4 — Database và SQL","\u002Fphong-van\u002Flo-trinh\u002Fngay-4-database-sql","1.phong-van\u002F2.lo-trinh\u002F4.ngay-4-database-sql","i-lucide-4",{"title":52,"path":53,"stem":54,"icon":55},"Ngày 5 — ASP.NET Core và EF Core","\u002Fphong-van\u002Flo-trinh\u002Fngay-5-aspnet-efcore","1.phong-van\u002F2.lo-trinh\u002F5.ngay-5-aspnet-efcore","i-lucide-5",{"title":57,"path":58,"stem":59,"icon":60},"Ngày 6 — DSA coding","\u002Fphong-van\u002Flo-trinh\u002Fngay-6-dsa","1.phong-van\u002F2.lo-trinh\u002F6.ngay-6-dsa","i-lucide-6",{"title":62,"path":63,"stem":64,"icon":65},"Ngày 7 — Mock và HR","\u002Fphong-van\u002Flo-trinh\u002Fngay-7-mock-interview","1.phong-van\u002F2.lo-trinh\u002F7.ngay-7-mock-interview","i-lucide-7",{"title":67,"icon":68,"path":69,"stem":70,"children":71,"page":26},"Ngân hàng câu hỏi","i-lucide-database","\u002Fphong-van\u002Fngan-hang-cau-hoi","1.phong-van\u002F3.ngan-hang-cau-hoi",[72,77,82,87,92,97,102,107],{"title":73,"path":74,"stem":75,"icon":76},"C# (60+ câu)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fcsharp","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F1.csharp","i-lucide-hash",{"title":78,"path":79,"stem":80,"icon":81},"OOP và SOLID (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Foop","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F2.oop","i-lucide-shapes",{"title":83,"path":84,"stem":85,"icon":86},"SQL (40+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fsql","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F3.sql","i-lucide-database-zap",{"title":88,"path":89,"stem":90,"icon":91},"ASP.NET và EF (50+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-ef","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F4.aspnet-ef","i-lucide-server",{"title":93,"path":94,"stem":95,"icon":96},"DSA và Coding (30+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdsa-coding","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F5.dsa-coding","i-lucide-binary",{"title":98,"path":99,"stem":100,"icon":101},"HR và Soft skill (25+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fhr-behavior","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F6.hr-behavior","i-lucide-users",{"title":103,"path":104,"stem":105,"icon":106},"Design Pattern (55+)","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Fdesign-pattern","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F7.design-pattern","i-lucide-puzzle",{"title":108,"path":109,"stem":110,"icon":91},"ASP.NET MVC và Web API","\u002Fphong-van\u002Fngan-hang-cau-hoi\u002Faspnet-mvc-webapi","1.phong-van\u002F3.ngan-hang-cau-hoi\u002F8.aspnet-mvc-webapi",{"title":112,"itle":113,"icon":114,"path":115,"stem":116,"children":117,"page":26},"Tai Lieu","Tài liệu và Cheat sheet","i-lucide-book-marked","\u002Fphong-van\u002Ftai-lieu","1.phong-van\u002F4.tai-lieu",[118,123],{"title":119,"path":120,"stem":121,"icon":122},"Cheat Sheet","\u002Fphong-van\u002Ftai-lieu\u002Fcheatsheet","1.phong-van\u002F4.tai-lieu\u002F1.cheatsheet","i-lucide-clipboard-list",{"title":124,"path":125,"stem":126,"icon":127},"Nguồn tham khảo","\u002Fphong-van\u002Ftai-lieu\u002Fnguon","1.phong-van\u002F4.tai-lieu\u002F2.nguon","i-lucide-link",{"title":129,"icon":130,"path":131,"stem":132,"children":133,"page":26},"Phỏng vấn English","i-lucide-globe","\u002Fphong-van\u002Fenglish-interview","1.phong-van\u002F5.english-interview",[134,138,143,148],{"title":135,"path":136,"stem":137,"icon":130},"Tổng quan English","\u002Fphong-van\u002Fenglish-interview\u002Ftong-quan","1.phong-van\u002F5.english-interview\u002F1.tong-quan",{"title":139,"path":140,"stem":141,"icon":142},"Vocabulary","\u002Fphong-van\u002Fenglish-interview\u002Fvocabulary","1.phong-van\u002F5.english-interview\u002F2.vocabulary","i-lucide-book-a",{"title":144,"path":145,"stem":146,"icon":147},"Technical Q và A (EN)","\u002Fphong-van\u002Fenglish-interview\u002Ftechnical-en","1.phong-van\u002F5.english-interview\u002F3.technical-en","i-lucide-code",{"title":149,"path":150,"stem":151,"icon":152},"Behavioral (EN)","\u002Fphong-van\u002Fenglish-interview\u002Fbehavioral-en","1.phong-van\u002F5.english-interview\u002F4.behavioral-en","i-lucide-message-square-text",{"title":154,"icon":155,"path":156,"stem":157,"children":158},"Tự học","i-lucide-graduation-cap","\u002Ftu-hoc","2.tu-hoc",[159,161,287,310,333,357,384],{"title":154,"path":156,"stem":160,"icon":155},"2.tu-hoc\u002Findex",{"title":162,"icon":68,"path":163,"stem":164,"children":165},"Database","\u002Ftu-hoc\u002Fdatabase","2.tu-hoc\u002F1.database\u002Findex",[166,167,197,222,243,248],{"title":162,"path":163,"stem":164,"icon":68},{"title":168,"icon":91,"path":169,"stem":170,"children":171,"page":26},"SQL Server","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server","2.tu-hoc\u002F1.database\u002F2.sql-server",[172,177,182,187,192],{"title":173,"path":174,"stem":175,"icon":176},"1. Giới thiệu và Cài đặt","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F1.gioi-thieu-cai-dat","i-lucide-play-circle",{"title":178,"path":179,"stem":180,"icon":181},"2. Cú pháp cơ bản","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F2.cu-phap-co-ban","i-lucide-code-2",{"title":183,"path":184,"stem":185,"icon":186},"3. Truy vấn nâng cao","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F3.truy-van-nang-cao","i-lucide-git-merge",{"title":188,"path":189,"stem":190,"icon":191},"4. Đặc thù và Performance","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F4.dac-thu-performance","i-lucide-gauge",{"title":193,"path":194,"stem":195,"icon":196},"5. Q và A phỏng vấn","\u002Ftu-hoc\u002Fdatabase\u002Fsql-server\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F2.sql-server\u002F5.cau-hoi-phong-van","i-lucide-message-circle-question",{"title":198,"icon":199,"path":200,"stem":201,"children":202,"page":26},"PostgreSQL","i-simple-icons-postgresql","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql","2.tu-hoc\u002F1.database\u002F3.postgresql",[203,206,209,212,215,218],{"title":173,"path":204,"stem":205,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":207,"stem":208,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F2.cu-phap-co-ban",{"title":183,"path":210,"stem":211,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F3.truy-van-nang-cao",{"title":188,"path":213,"stem":214,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F4.dac-thu-performance",{"title":193,"path":216,"stem":217,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F5.cau-hoi-phong-van",{"title":219,"path":220,"stem":221,"icon":96},"6. Tích hợp C# và Postgres","\u002Ftu-hoc\u002Fdatabase\u002Fpostgresql\u002Ftich-hop-csharp","2.tu-hoc\u002F1.database\u002F3.postgresql\u002F6.tich-hop-csharp",{"title":223,"icon":224,"path":225,"stem":226,"children":227,"page":26},"MySQL","i-simple-icons-mysql","\u002Ftu-hoc\u002Fdatabase\u002Fmysql","2.tu-hoc\u002F1.database\u002F4.mysql",[228,231,234,237,240],{"title":173,"path":229,"stem":230,"icon":176},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F1.database\u002F4.mysql\u002F1.gioi-thieu-cai-dat",{"title":178,"path":232,"stem":233,"icon":181},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcu-phap-co-ban","2.tu-hoc\u002F1.database\u002F4.mysql\u002F2.cu-phap-co-ban",{"title":183,"path":235,"stem":236,"icon":186},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Ftruy-van-nang-cao","2.tu-hoc\u002F1.database\u002F4.mysql\u002F3.truy-van-nang-cao",{"title":188,"path":238,"stem":239,"icon":191},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fdac-thu-performance","2.tu-hoc\u002F1.database\u002F4.mysql\u002F4.dac-thu-performance",{"title":193,"path":241,"stem":242,"icon":196},"\u002Ftu-hoc\u002Fdatabase\u002Fmysql\u002Fcau-hoi-phong-van","2.tu-hoc\u002F1.database\u002F4.mysql\u002F5.cau-hoi-phong-van",{"title":244,"path":245,"stem":246,"icon":247},"So sánh 3 RDBMS","\u002Ftu-hoc\u002Fdatabase\u002Fso-sanh","2.tu-hoc\u002F1.database\u002F5.so-sanh","i-lucide-columns-3",{"title":249,"path":250,"stem":251,"children":252,"icon":254},"Supabase (BaaS)","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002Findex",[253,255,259,264,269,274,278,283],{"title":249,"path":250,"stem":251,"icon":254},"i-simple-icons-supabase",{"title":256,"path":257,"stem":258,"icon":68},"1. Database","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fdatabase","2.tu-hoc\u002F1.database\u002F6.supabase\u002F1.database",{"title":260,"path":261,"stem":262,"icon":263},"2. Authentication","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fauthentication","2.tu-hoc\u002F1.database\u002F6.supabase\u002F2.authentication","i-lucide-key",{"title":265,"path":266,"stem":267,"icon":268},"3. Storage & Realtime","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fstorage-realtime","2.tu-hoc\u002F1.database\u002F6.supabase\u002F3.storage-realtime","i-lucide-zap",{"title":270,"path":271,"stem":272,"icon":273},"4. Edge Functions & AI","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Ffunctions-ai","2.tu-hoc\u002F1.database\u002F6.supabase\u002F4.functions-ai","i-lucide-brain",{"title":275,"path":276,"stem":277,"icon":181},"5. API & SDKs","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fapi-sdk","2.tu-hoc\u002F1.database\u002F6.supabase\u002F5.api-sdk",{"title":279,"path":280,"stem":281,"icon":282},"6. Platform & Deploy","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Fplatform-deploy","2.tu-hoc\u002F1.database\u002F6.supabase\u002F6.platform-deploy","i-lucide-cloud",{"title":284,"path":285,"stem":286,"icon":196},"7. Interview & Q&A","\u002Ftu-hoc\u002Fdatabase\u002Fsupabase\u002Finterview","2.tu-hoc\u002F1.database\u002F6.supabase\u002F7.interview",{"title":288,"icon":289,"path":290,"stem":291,"children":292},"TypeScript","i-simple-icons-typescript","\u002Ftu-hoc\u002Ftypescript","2.tu-hoc\u002F2.typescript\u002Findex",[293,294,297,301,306],{"title":288,"path":290,"stem":291,"icon":289},{"title":173,"path":295,"stem":296,"icon":176},"\u002Ftu-hoc\u002Ftypescript\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F2.typescript\u002F1.gioi-thieu-cai-dat",{"title":298,"path":299,"stem":300,"icon":81},"2. Type System","\u002Ftu-hoc\u002Ftypescript\u002Ftype-system","2.tu-hoc\u002F2.typescript\u002F2.type-system",{"title":302,"path":303,"stem":304,"icon":305},"3. Advanced types","\u002Ftu-hoc\u002Ftypescript\u002Fadvanced-types","2.tu-hoc\u002F2.typescript\u002F3.advanced-types","i-lucide-braces",{"title":307,"path":308,"stem":309,"icon":196},"4. Q và A phỏng vấn","\u002Ftu-hoc\u002Ftypescript\u002Fcau-hoi-phong-van","2.tu-hoc\u002F2.typescript\u002F4.cau-hoi-phong-van",{"title":311,"icon":81,"path":312,"stem":313,"children":314},"OOP","\u002Ftu-hoc\u002Foop","2.tu-hoc\u002F3.oop\u002Findex",[315,316,321,326,330],{"title":311,"path":312,"stem":313,"icon":81},{"title":317,"path":318,"stem":319,"icon":320},"1. Bốn tính chất","\u002Ftu-hoc\u002Foop\u002F4-tinh-chat","2.tu-hoc\u002F3.oop\u002F1.4-tinh-chat","i-lucide-circle-dot",{"title":322,"path":323,"stem":324,"icon":325},"2. SOLID","\u002Ftu-hoc\u002Foop\u002Fsolid","2.tu-hoc\u002F3.oop\u002F2.solid","i-lucide-shield",{"title":327,"path":328,"stem":329,"icon":106},"3. Design Pattern","\u002Ftu-hoc\u002Foop\u002Fdesign-pattern","2.tu-hoc\u002F3.oop\u002F3.design-pattern",{"title":307,"path":331,"stem":332,"icon":196},"\u002Ftu-hoc\u002Foop\u002Fcau-hoi-phong-van","2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van",{"title":334,"icon":305,"path":335,"stem":336,"children":337},"Generic","\u002Ftu-hoc\u002Fgeneric","2.tu-hoc\u002F4.generic\u002Findex",[338,339,344,349,354],{"title":334,"path":335,"stem":336,"icon":305},{"title":340,"path":341,"stem":342,"icon":343},"1. Khái niệm và cú pháp","\u002Ftu-hoc\u002Fgeneric\u002Fkhai-niem","2.tu-hoc\u002F4.generic\u002F1.khai-niem","i-lucide-book",{"title":345,"path":346,"stem":347,"icon":348},"2. Constraint và Variance","\u002Ftu-hoc\u002Fgeneric\u002Fconstraint-variance","2.tu-hoc\u002F4.generic\u002F2.constraint-variance","i-lucide-filter",{"title":350,"path":351,"stem":352,"icon":353},"3. C# vs TS","\u002Ftu-hoc\u002Fgeneric\u002Fso-sanh","2.tu-hoc\u002F4.generic\u002F3.so-sanh","i-lucide-git-compare",{"title":307,"path":355,"stem":356,"icon":196},"\u002Ftu-hoc\u002Fgeneric\u002Fcau-hoi-phong-van","2.tu-hoc\u002F4.generic\u002F4.cau-hoi-phong-van",{"title":358,"icon":359,"path":360,"stem":361,"children":362},"Nuxt 4","i-simple-icons-nuxt","\u002Ftu-hoc\u002Fnuxt-4","2.tu-hoc\u002F5.nuxt-4\u002Findex",[363,364,367,372,376,379],{"title":358,"path":360,"stem":361,"icon":359},{"title":173,"path":365,"stem":366,"icon":176},"\u002Ftu-hoc\u002Fnuxt-4\u002Fgioi-thieu-cai-dat","2.tu-hoc\u002F5.nuxt-4\u002F1.gioi-thieu-cai-dat",{"title":368,"path":369,"stem":370,"icon":371},"2. Routing và Rendering","\u002Ftu-hoc\u002Fnuxt-4\u002Frouting-rendering","2.tu-hoc\u002F5.nuxt-4\u002F2.routing-rendering","i-lucide-route",{"title":373,"path":374,"stem":375,"icon":91},"3. Data và Server","\u002Ftu-hoc\u002Fnuxt-4\u002Fdata-server","2.tu-hoc\u002F5.nuxt-4\u002F3.data-server",{"title":307,"path":377,"stem":378,"icon":196},"\u002Ftu-hoc\u002Fnuxt-4\u002Fcau-hoi-phong-van","2.tu-hoc\u002F5.nuxt-4\u002F4.cau-hoi-phong-van",{"title":380,"path":381,"stem":382,"icon":383},"5. Practical Todo App","\u002Ftu-hoc\u002Fnuxt-4\u002Fpractical-todo-app","2.tu-hoc\u002F5.nuxt-4\u002F5.practical-todo-app","i-lucide-check-square",{"title":385,"path":386,"stem":387,"children":388,"icon":390},"Tailwind CSS","\u002Ftu-hoc\u002Ftailwindcss","2.tu-hoc\u002F6.tailwindcss\u002Findex",[389,391,396,401,406,411,416],{"title":385,"path":386,"stem":387,"icon":390},"i-simple-icons-tailwindcss",{"title":392,"path":393,"stem":394,"icon":395},"1. Layout & Spacing","\u002Ftu-hoc\u002Ftailwindcss\u002Flayout-spacing","2.tu-hoc\u002F6.tailwindcss\u002F1.layout-spacing","i-lucide-layout",{"title":397,"path":398,"stem":399,"icon":400},"2. Typography & Colors","\u002Ftu-hoc\u002Ftailwindcss\u002Ftypography-colors","2.tu-hoc\u002F6.tailwindcss\u002F2.typography-colors","i-lucide-type",{"title":402,"path":403,"stem":404,"icon":405},"3. Interactive & Effects","\u002Ftu-hoc\u002Ftailwindcss\u002Finteractive-effects","2.tu-hoc\u002F6.tailwindcss\u002F3.interactive-effects","i-lucide-sparkles",{"title":407,"path":408,"stem":409,"icon":410},"4. Responsive & Dark Mode","\u002Ftu-hoc\u002Ftailwindcss\u002Fresponsive-darkmode","2.tu-hoc\u002F6.tailwindcss\u002F4.responsive-darkmode","i-lucide-monitor-smartphone",{"title":412,"path":413,"stem":414,"icon":415},"5. Customization & Theme","\u002Ftu-hoc\u002Ftailwindcss\u002Fcustomization","2.tu-hoc\u002F6.tailwindcss\u002F5.customization","i-lucide-settings-2",{"title":417,"path":418,"stem":419,"icon":181},"6. Practical Projects","\u002Ftu-hoc\u002Ftailwindcss\u002Fpractical-projects","2.tu-hoc\u002F6.tailwindcss\u002F6.practical-projects",{"id":421,"title":422,"body":423,"description":1630,"extension":1631,"links":1632,"meta":1633,"navigation":1634,"path":331,"seo":1635,"stem":332,"__hash__":1636},"docs\u002F2.tu-hoc\u002F3.oop\u002F4.cau-hoi-phong-van.md","Câu hỏi phỏng vấn OOP",{"type":424,"value":425,"toc":1539},"minimark",[426,431,436,440,444,457,460,464,467,476,479,483,487,541,545,565,568,572,586,590,601,605,612,616,647,651,658,662,674,688,709,713,717,789,793,810,814,817,821,827,831,834,869,873,877,880,884,903,907,918,922,940,944,951,955,978,982,995,999,1010,1014,1028,1032,1035,1039,1043,1046,1050,1061,1065,1083,1087,1091,1121,1127,1131,1134,1138,1144,1148,1151,1155,1162,1166,1170,1181,1185,1207,1211,1220,1224,1227,1231,1235,1255,1259,1267,1271,1290,1294,1302,1306,1309,1313,1323,1327,1330,1334,1338,1345,1349,1360,1364,1375,1379,1392,1396,1400,1403,1407,1410,1414,1426,1429,1433,1436,1440,1447,1453,1457,1463,1467,1473,1477,1480,1492,1505,1513,1520,1524,1527,1535],[427,428,430],"h2",{"id":429},"a-tổng-quan-oop","A. Tổng quan OOP",[432,433,435],"h3",{"id":434},"_1-oop-là-gì","1. OOP là gì?",[437,438,439],"p",{},"Paradigm mô hình hoá thế giới thực bằng object — gói state + behavior trong 1 entity. 4 tính chất: Encapsulation, Abstraction, Inheritance, Polymorphism.",[432,441,443],{"id":442},"_2-oop-khác-procedural-khác-functional","2. OOP khác Procedural khác Functional?",[445,446,447,451,454],"ul",{},[448,449,450],"li",{},"Procedural: tổ chức quanh function\u002Fprocedure thao tác data.",[448,452,453],{},"OOP: gom data + function vào object.",[448,455,456],{},"Functional: tránh state, dùng pure function + immutable data.",[437,458,459],{},"Modern languages thường hybrid (C#, TS, Kotlin) — OOP + nhiều feature FP.",[432,461,463],{"id":462},"_3-class-vs-object","3. Class vs Object?",[437,465,466],{},"Class = blueprint (template). Object = instance (thực thể) cụ thể từ class.",[432,468,470,471,475],{"id":469},"_4-static-member-là-gì","4. ",[472,473,474],"code",{},"static"," member là gì?",[437,477,478],{},"Member thuộc về class, không phải instance. Truy cập qua tên class. Một bản duy nhất share toàn app.",[427,480,482],{"id":481},"b-4-tính-chất","B. 4 tính chất",[432,484,486],{"id":485},"_5-kể-4-tính-chất-oop-và-ví-dụ","5. Kể 4 tính chất OOP và ví dụ?",[488,489,490,509,519,529],"ol",{},[448,491,492,496,497,500,501,504,505,508],{},[493,494,495],"strong",{},"Encapsulation",": che giấu state, expose API có validation. Ví dụ ",[472,498,499],{},"BankAccount"," ẩn ",[472,502,503],{},"_balance",", expose ",[472,506,507],{},"Deposit\u002FWithdraw",".",[448,510,511,514,515,518],{},[493,512,513],{},"Abstraction",": tách \"cái gì\" khỏi \"làm sao\". ",[472,516,517],{},"IPaymentGateway"," không lộ chi tiết HTTP.",[448,520,521,524,525,528],{},[493,522,523],{},"Inheritance",": ",[472,526,527],{},"Dog : Animal"," — reuse + chuyên biệt hoá.",[448,530,531,524,534,537,538,508],{},[493,532,533],{},"Polymorphism",[472,535,536],{},"Animal a = new Dog(); a.Speak()"," → runtime gọi đúng ",[472,539,540],{},"Dog.Speak()",[432,542,544],{"id":543},"_6-encapsulation-khác-abstraction","6. Encapsulation khác Abstraction?",[445,546,547,558],{},[448,548,549,550,553,554,557],{},"Encapsulation = ",[493,551,552],{},"mechanism"," (",[472,555,556],{},"private",", getter\u002Fsetter).",[448,559,560,561,564],{},"Abstraction = ",[493,562,563],{},"concept"," (chỉ expose cái cần thiết).",[437,566,567],{},"Encapsulation phục vụ Abstraction. Gộp lại = API đơn giản + an toàn.",[432,569,571],{"id":570},"_7-inheritance-is-a-hay-has-a","7. Inheritance — \"is-a\" hay \"has-a\"?",[437,573,574,577,578,581,582,585],{},[493,575,576],{},"Is-a."," ",[472,579,580],{},"Dog IS-A Animal",". Có \"has-a\" → dùng ",[493,583,584],{},"composition",", không phải inheritance.",[432,587,589],{"id":588},"_8-multiple-inheritance-trong-cts","8. Multiple inheritance trong C#\u002FTS?",[437,591,592,593,596,597,600],{},"Cả 2 chỉ kế thừa ",[493,594,595],{},"1 class",", implement ",[493,598,599],{},"nhiều interface",". TS có pattern mixin để mô phỏng.",[432,602,604],{"id":603},"_9-vì-sao-không-hỗ-trợ-multiple-class-inheritance","9. Vì sao không hỗ trợ multiple class inheritance?",[437,606,607,608,611],{},"Tránh ",[493,609,610],{},"diamond problem",": 2 base có method cùng tên → con kế thừa cái nào không rõ. Interface không state nên không có vấn đề này.",[432,613,615],{"id":614},"_10-polymorphism-có-mấy-loại","10. Polymorphism có mấy loại?",[445,617,618,624,638],{},[448,619,620,623],{},[493,621,622],{},"Compile-time"," (static): overloading — cùng tên, khác signature.",[448,625,626,629,630,633,634,637],{},[493,627,628],{},"Runtime"," (dynamic): overriding — ",[472,631,632],{},"virtual","\u002F",[472,635,636],{},"override",", vtable.",[448,639,640,643,644,508],{},[493,641,642],{},"Parametric"," (generic): code làm việc với nhiều type — học ở ",[645,646,334],"a",{"href":335},[432,648,650],{"id":649},"_11-đa-hình-runtime-hoạt-động-ra-sao","11. Đa hình runtime hoạt động ra sao?",[437,652,653,654,657],{},"Qua ",[493,655,656],{},"vtable"," (virtual method table). Mỗi class lưu pointer tới method virtual. Runtime tra vtable của object thực để gọi đúng method.",[432,659,661],{"id":660},"_12-overload-vs-override","12. Overload vs Override?",[445,663,664,671],{},[448,665,666,667,670],{},"Overload: cùng tên, khác parameter list, ",[493,668,669],{},"trong cùng class",", compile-time.",[448,672,673],{},"Override: redefine method virtual của cha trong con, runtime.",[432,675,677,678,680,681,680,684,687],{"id":676},"_13-virtual-abstract-sealed-khác-nhau","13. ",[472,679,632],{},", ",[472,682,683],{},"abstract",[472,685,686],{},"sealed"," khác nhau?",[445,689,690,695,700],{},[448,691,692,694],{},[472,693,632],{},": cho phép con override.",[448,696,697,699],{},[472,698,683],{},": chỉ khai báo, con bắt buộc implement. Class chứa abstract member → class phải abstract.",[448,701,702,704,705,708],{},[472,703,686],{}," (C#) \u002F ",[472,706,707],{},"final"," (Java\u002FKotlin): không cho kế thừa \u002F override tiếp.",[427,710,712],{"id":711},"c-interface-abstract-class","C. Interface & Abstract class",[432,714,716],{"id":715},"_14-interface-vs-abstract-class","14. Interface vs Abstract class?",[718,719,720,735],"table",{},[721,722,723],"thead",{},[724,725,726,729,732],"tr",{},[727,728],"th",{},[727,730,731],{},"Interface",[727,733,734],{},"Abstract class",[736,737,738,750,759,768,778],"tbody",{},[724,739,740,744,747],{},[741,742,743],"td",{},"Multiple inheritance",[741,745,746],{},"✅",[741,748,749],{},"❌",[724,751,752,755,757],{},[741,753,754],{},"Field\u002Fstate",[741,756,749],{},[741,758,746],{},[724,760,761,764,766],{},[741,762,763],{},"Constructor",[741,765,749],{},[741,767,746],{},[724,769,770,773,776],{},[741,771,772],{},"Default method",[741,774,775],{},"C# 8+ có",[741,777,746],{},[724,779,780,783,786],{},[741,781,782],{},"Mục đích",[741,784,785],{},"Capability",[741,787,788],{},"Bản chất",[432,790,792],{"id":791},"_15-khi-nào-dùng-interface-khi-nào-abstract-class","15. Khi nào dùng interface, khi nào abstract class?",[445,794,795,801,807],{},[448,796,797,798,800],{},"Share ",[493,799,472],{}," (method body, field) → abstract class.",[448,802,797,803,806],{},[493,804,805],{},"contract"," (hợp đồng) → interface.",[448,808,809],{},"Multiple inheritance → interface.",[432,811,813],{"id":812},"_16-default-interface-method-c-8-là-gì","16. Default interface method (C# 8+) là gì?",[437,815,816],{},"Interface có method với body, làm fallback. Class implement có thể override hoặc không. Hữu ích để thêm member mà không break existing impl.",[432,818,820],{"id":819},"_17-class-có-thể-vừa-kế-thừa-class-vừa-implement-interface","17. Class có thể vừa kế thừa class vừa implement interface?",[437,822,823,824,508],{},"Có. Cú pháp: ",[472,825,826],{},"class A : BaseClass, IInterface1, IInterface2",[432,828,830],{"id":829},"_18-explicit-interface-implementation","18. Explicit interface implementation?",[437,832,833],{},"Khi 2 interface có method trùng tên cần impl khác nhau:",[835,836,841],"pre",{"className":837,"code":838,"language":839,"meta":840,"style":840},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","class Logger : IConsoleLog, IFileLog {\n    void IConsoleLog.Log(string m) {}\n    void IFileLog.Log(string m) {}\n}\n","csharp","",[472,842,843,851,857,863],{"__ignoreMap":840},[844,845,848],"span",{"class":846,"line":847},"line",1,[844,849,850],{},"class Logger : IConsoleLog, IFileLog {\n",[844,852,854],{"class":846,"line":853},2,[844,855,856],{},"    void IConsoleLog.Log(string m) {}\n",[844,858,860],{"class":846,"line":859},3,[844,861,862],{},"    void IFileLog.Log(string m) {}\n",[844,864,866],{"class":846,"line":865},4,[844,867,868],{},"}\n",[427,870,872],{"id":871},"d-solid","D. SOLID",[432,874,876],{"id":875},"_19-solid-là-gì","19. SOLID là gì?",[437,878,879],{},"5 nguyên lý thiết kế OOP của Robert C. Martin: Single Responsibility, Open\u002FClosed, Liskov Substitution, Interface Segregation, Dependency Inversion.",[432,881,883],{"id":882},"_20-single-responsibility-ví-dụ","20. Single Responsibility — ví dụ?",[437,885,886,887,890,891,893,894,680,897,680,900,508],{},"Class chỉ 1 lý do thay đổi. ❌ ",[472,888,889],{},"Order"," ôm Calculate + Save + SendEmail. ✅ Tách ",[472,892,889],{}," (state), ",[472,895,896],{},"OrderCalculator",[472,898,899],{},"OrderRepository",[472,901,902],{},"OrderEmailService",[432,904,906],{"id":905},"_21-openclosed-ví-dụ","21. Open\u002FClosed — ví dụ?",[437,908,909,910,913,914,917],{},"Mở mở rộng, đóng sửa. ❌ ",[472,911,912],{},"if shape is Circle...else if Square..."," mỗi shape mới phải sửa. ✅ ",[472,915,916],{},"abstract Shape.Area()",", mỗi shape là 1 class.",[432,919,921],{"id":920},"_22-liskov-substitution-ví-dụ-vi-phạm","22. Liskov Substitution — ví dụ vi phạm?",[437,923,924,925,928,929,932,933,935,936,939],{},"Penguin extends Bird, Bird có ",[472,926,927],{},"Fly()"," → Penguin throw. Caller có ",[472,930,931],{},"List\u003CBird>"," gọi ",[472,934,927],{}," → crash với Penguin. Fix: tách ",[472,937,938],{},"IFlyable"," interface.",[432,941,943],{"id":942},"_23-vì-sao-square-rectangle-vi-phạm-lsp","23. Vì sao Square : Rectangle vi phạm LSP?",[437,945,946,947,950],{},"Caller set width, height độc lập (Rectangle), assume ",[472,948,949],{},"Area = w * h",". Square override setter làm w = h → phá assumption. Fix: 2 class không kế thừa nhau.",[432,952,954],{"id":953},"_24-interface-segregation-ví-dụ","24. Interface Segregation — ví dụ?",[437,956,957,958,961,962,965,966,680,969,680,972,975,976,508],{},"❌ ",[472,959,960],{},"IWorker { Work, Eat, Sleep }"," — Robot phải throw ",[472,963,964],{},"Eat",". ✅ Tách ",[472,967,968],{},"IWorkable",[472,970,971],{},"IFeedable",[472,973,974],{},"IRestable",". Robot chỉ implement ",[472,977,968],{},[432,979,981],{"id":980},"_25-dependency-inversion-ví-dụ","25. Dependency Inversion — ví dụ?",[437,983,957,984,577,987,990,991,994],{},[472,985,986],{},"OrderService",[472,988,989],{},"new EmailService()"," gắn cứng. ✅ Depend ",[472,992,993],{},"INotificationService",", inject qua constructor. Đổi sang SMS chỉ cần đổi binding container.",[432,996,998],{"id":997},"_26-dip-vs-di-vs-ioc","26. DIP vs DI vs IoC?",[445,1000,1001,1004,1007],{},[448,1002,1003],{},"DIP: nguyên lý (depend abstraction).",[448,1005,1006],{},"IoC: nguyên lý lớn hơn (đảo control flow, framework gọi code bạn).",[448,1008,1009],{},"DI: kỹ thuật thực thi DIP\u002FIoC (constructor injection, container).",[432,1011,1013],{"id":1012},"_27-solid-nguyên-lý-nào-quan-trọng-nhất-cho-fresher","27. SOLID nguyên lý nào quan trọng nhất cho fresher?",[445,1015,1016,1022],{},[448,1017,1018,1021],{},[493,1019,1020],{},"SRP",": dễ hiểu nhất, áp dụng ngay được.",[448,1023,1024,1027],{},[493,1025,1026],{},"DIP",": gặp hằng ngày khi viết ASP.NET Core \u002F NestJS.",[432,1029,1031],{"id":1030},"_28-khi-nào-không-áp-dụng-solid","28. Khi nào KHÔNG áp dụng SOLID?",[437,1033,1034],{},"Script nhỏ, prototype, throwaway code. Lạm dụng → over-engineering.",[427,1036,1038],{"id":1037},"e-composition-vs-inheritance","E. Composition vs Inheritance",[432,1040,1042],{"id":1041},"_29-favor-composition-over-inheritance-vì-sao","29. \"Favor composition over inheritance\" — vì sao?",[437,1044,1045],{},"Inheritance: ràng buộc behavior chặt (LSP, fragile base class). Composition: linh hoạt, dễ swap, dễ test. Hierarchy sâu > 3 cấp thường là code smell.",[432,1047,1049],{"id":1048},"_30-composition-khác-aggregation-khác-association","30. Composition khác Aggregation khác Association?",[445,1051,1052,1055,1058],{},[448,1053,1054],{},"Association: 2 class biết nhau (User và Order).",[448,1056,1057],{},"Aggregation: has-a yếu, sống độc lập (Library has Books).",[448,1059,1060],{},"Composition: has-a mạnh, vòng đời gắn liền (House has Rooms — phá House thì Room mất).",[432,1062,1064],{"id":1063},"_31-cho-ví-dụ-composition","31. Cho ví dụ Composition?",[437,1066,1067,1070,1071,1074,1075,1078,1079,1082],{},[472,1068,1069],{},"Car"," chứa ",[472,1072,1073],{},"IEngine",". Engine sống độc lập. Đổi ",[472,1076,1077],{},"GasEngine"," → ",[472,1080,1081],{},"ElectricEngine"," không động Car.",[427,1084,1086],{"id":1085},"f-design-pattern-creational","F. Design Pattern — Creational",[432,1088,1090],{"id":1089},"_32-singleton-implement-thread-safe","32. Singleton — implement thread-safe?",[835,1092,1094],{"className":837,"code":1093,"language":839,"meta":840,"style":840},"public sealed class S {\n    private static readonly Lazy\u003CS> _i = new(() => new S());\n    public static S Instance => _i.Value;\n    private S() {}\n}\n",[472,1095,1096,1101,1106,1111,1116],{"__ignoreMap":840},[844,1097,1098],{"class":846,"line":847},[844,1099,1100],{},"public sealed class S {\n",[844,1102,1103],{"class":846,"line":853},[844,1104,1105],{},"    private static readonly Lazy\u003CS> _i = new(() => new S());\n",[844,1107,1108],{"class":846,"line":859},[844,1109,1110],{},"    public static S Instance => _i.Value;\n",[844,1112,1113],{"class":846,"line":865},[844,1114,1115],{},"    private S() {}\n",[844,1117,1119],{"class":846,"line":1118},5,[844,1120,868],{},[437,1122,1123,1126],{},[472,1124,1125],{},"Lazy\u003CT>"," lo lazy + thread-safe.",[432,1128,1130],{"id":1129},"_33-singleton-lạm-dụng-có-hại-gì","33. Singleton lạm dụng có hại gì?",[437,1132,1133],{},"Global state → khó test (test này ảnh hưởng test kia), hidden dependency, khó parallel. Modern app dùng DI container Singleton lifetime.",[432,1135,1137],{"id":1136},"_34-factory-pattern-dùng-khi-nào","34. Factory pattern dùng khi nào?",[437,1139,1140,1141,508],{},"Tạo object có logic phức tạp, hoặc concrete class quyết runtime. Ví dụ ",[472,1142,1143],{},"IShape Create(string type)",[432,1145,1147],{"id":1146},"_35-builder-vs-constructor-với-nhiều-parameter","35. Builder vs Constructor với nhiều parameter?",[437,1149,1150],{},"Builder: fluent, optional dễ skip, tên rõ. Constructor 10 parameter khó đọc, dễ nhầm thứ tự.",[432,1152,1154],{"id":1153},"_36-prototype-pattern","36. Prototype pattern?",[437,1156,1157,1158,1161],{},"Clone object hiện có thay vì new — khi tạo object expensive. C# có ",[472,1159,1160],{},"ICloneable"," nhưng khuyên dùng deep copy thủ công.",[427,1163,1165],{"id":1164},"g-design-pattern-structural","G. Design Pattern — Structural",[432,1167,1169],{"id":1168},"_37-adapter-ví-dụ-thực-tế","37. Adapter — ví dụ thực tế?",[437,1171,1172,1173,1176,1177,1180],{},"Wrap legacy ",[472,1174,1175],{},"OldPaymentGateway.DoPayment(double)"," thành ",[472,1178,1179],{},"IPaymentService.ChargeAsync(decimal)",". Service chỉ thấy interface mới.",[432,1182,1184],{"id":1183},"_38-decorator-ví-dụ","38. Decorator — ví dụ?",[437,1186,1187,1190,1191,1190,1194,1197,1198,1078,1201,1078,1204,508],{},[472,1188,1189],{},"SimpleCoffee"," → wrap ",[472,1192,1193],{},"MilkDecorator",[472,1195,1196],{},"CaramelDecorator",". Mỗi cấp add cost + description. Stream chain trong .NET: ",[472,1199,1200],{},"FileStream",[472,1202,1203],{},"BufferedStream",[472,1205,1206],{},"CryptoStream",[432,1208,1210],{"id":1209},"_39-facade-ví-dụ-trong-net","39. Facade — ví dụ trong .NET?",[437,1212,1213,680,1216,1219],{},[472,1214,1215],{},"services.AddDbContext()",[472,1217,1218],{},"app.MapControllers()"," — wrap nhiều setup phức tạp thành 1 dòng.",[432,1221,1223],{"id":1222},"_40-proxy-pattern","40. Proxy pattern?",[437,1225,1226],{},"Object đứng giữa client và target — kiểm soát truy cập, lazy load, caching, logging. EF Core lazy loading proxy là Proxy pattern.",[427,1228,1230],{"id":1229},"h-design-pattern-behavioral","H. Design Pattern — Behavioral",[432,1232,1234],{"id":1233},"_41-strategy-ví-dụ","41. Strategy — ví dụ?",[437,1236,1237,1240,1241,680,1244,680,1247,1250,1251,1254],{},[472,1238,1239],{},"IDiscountStrategy"," với ",[472,1242,1243],{},"NoDiscount",[472,1245,1246],{},"TenPercent",[472,1248,1249],{},"StudentDiscount",". ",[472,1252,1253],{},"Cart"," inject strategy, đổi runtime.",[432,1256,1258],{"id":1257},"_42-strategy-khác-state-pattern","42. Strategy khác State pattern?",[445,1260,1261,1264],{},[448,1262,1263],{},"Strategy: client chọn algorithm.",[448,1265,1266],{},"State: object tự đổi state nội bộ, behavior thay đổi theo state.",[432,1268,1270],{"id":1269},"_43-observer-net-implement-ra-sao","43. Observer — .NET implement ra sao?",[437,1272,1273,1274,1277,1278,1281,1282,1285,1286,1289],{},"Built-in qua ",[472,1275,1276],{},"event"," keyword + ",[472,1279,1280],{},"EventHandler",". Hoặc ",[472,1283,1284],{},"IObservable\u003CT>"," \u002F ",[472,1287,1288],{},"IObserver\u003CT>"," (Reactive Extensions).",[432,1291,1293],{"id":1292},"_44-observer-vs-pubsub","44. Observer vs Pub\u002FSub?",[445,1295,1296,1299],{},[448,1297,1298],{},"Observer: subject biết observer (in-process).",[448,1300,1301],{},"Pub\u002FSub: message broker giữa publisher và subscriber (cross-process).",[432,1303,1305],{"id":1304},"_45-command-pattern-ứng-dụng","45. Command pattern — ứng dụng?",[437,1307,1308],{},"Undo\u002Fredo trong editor, transaction, MediatR (CQRS).",[432,1310,1312],{"id":1311},"_46-template-method","46. Template Method?",[437,1314,1315,1316,932,1319,1322],{},"Abstract class định nghĩa skeleton thuật toán, subclass override các bước cụ thể. Ví dụ ",[472,1317,1318],{},"DataExporter.Export()",[472,1320,1321],{},"LoadData → Transform → Format → Write",", mỗi subclass override 3 step đầu.",[432,1324,1326],{"id":1325},"_47-chain-of-responsibility","47. Chain of Responsibility?",[437,1328,1329],{},"Middleware pipeline ASP.NET Core, Express.js — mỗi handler có thể xử lý hoặc pass tiếp.",[427,1331,1333],{"id":1332},"i-repository-unit-of-work-ddd","I. Repository, Unit of Work, DDD",[432,1335,1337],{"id":1336},"_48-repository-pattern-vì-sao-dùng","48. Repository pattern — vì sao dùng?",[437,1339,1340,1341,1344],{},"Tách data access khỏi business. Service không biết SQL\u002FMongo, chỉ thấy ",[472,1342,1343],{},"IUserRepository",". Dễ test (mock), dễ swap DB.",[432,1346,1348],{"id":1347},"_49-repository-với-ef-core-có-thừa-không","49. Repository với EF Core — có thừa không?",[437,1350,1351,1352,1355,1356,1359],{},"Tranh cãi. EF Core đã là Repository + UoW. Nếu chỉ wrap ",[472,1353,1354],{},"_ctx.Users.Where(...)"," → thừa. Nếu có ",[493,1357,1358],{},"logic query đặc thù tái sử dụng"," → cần.",[432,1361,1363],{"id":1362},"_50-unit-of-work-là-gì","50. Unit of Work là gì?",[437,1365,1366,1367,1370,1371,1374],{},"Nhóm nhiều thao tác DB thành 1 transaction. EF Core ",[472,1368,1369],{},"DbContext"," chính là UoW — track changes, ",[472,1372,1373],{},"SaveChanges"," commit hết.",[432,1376,1378],{"id":1377},"_51-aggregate-root-ddd","51. Aggregate Root (DDD)?",[437,1380,1381,1382,1384,1385,1388,1389,1391],{},"Entity đại diện cho 1 cluster — mọi thao tác đi qua nó. Ví dụ ",[472,1383,889],{}," là root, ",[472,1386,1387],{},"OrderItem"," chỉ truy cập qua ",[472,1390,889],{},". Đảm bảo invariant.",[427,1393,1395],{"id":1394},"j-anti-pattern","J. Anti-pattern",[432,1397,1399],{"id":1398},"_52-god-class","52. God class?",[437,1401,1402],{},"Class 2000 dòng làm mọi thứ. Vi phạm SRP. Fix: tách theo trách nhiệm.",[432,1404,1406],{"id":1405},"_53-anemic-domain-model","53. Anemic Domain Model?",[437,1408,1409],{},"Entity chỉ có get\u002Fset, mọi logic ở service. OK cho DTO\u002FCRUD; không tốt cho domain phức tạp — nên có logic trong entity (Rich Domain).",[432,1411,1413],{"id":1412},"_54-service-locator-vs-di","54. Service Locator vs DI?",[445,1415,1416,1423],{},[448,1417,1418,1419,1422],{},"Service Locator: code tự ",[472,1420,1421],{},"Locator.Get\u003CIFoo>()"," — hide dependency.",[448,1424,1425],{},"DI: inject qua constructor — dependency rõ ràng.",[437,1427,1428],{},"DI tốt hơn — dependency là 1 phần API.",[432,1430,1432],{"id":1431},"_55-reinventing-the-wheel","55. \"Reinventing the wheel\"?",[437,1434,1435],{},"Tự viết lại feature framework đã có (caching, logging, validation) thay vì dùng built-in. Mất thời gian, dễ bug.",[427,1437,1439],{"id":1438},"k-câu-trick","K. Câu trick",[432,1441,1443,1444,1446],{"id":1442},"_56-static-method-có-thể-override-không","56. ",[472,1445,474],{}," method có thể override không?",[437,1448,1449,1452],{},[493,1450,1451],{},"Không"," ở C# (static thuộc class, không qua vtable). Java cho phép \"hiding\" nhưng không phải override thật.",[432,1454,1456],{"id":1455},"_57-constructor-có-thể-virtual-không","57. Constructor có thể virtual không?",[437,1458,1459,1462],{},[493,1460,1461],{},"Không."," Constructor chạy khi object chưa tồn tại đầy đủ → không có vtable lookup.",[432,1464,1466],{"id":1465},"_58-abstract-class-có-thể-không-có-abstract-method","58. Abstract class có thể không có abstract method?",[437,1468,1469,1472],{},[493,1470,1471],{},"Có."," Vẫn không instantiate được vì marked abstract. Dùng để ép luôn kế thừa.",[432,1474,1476],{"id":1475},"_59-interface-có-thể-chứa-constant-không","59. Interface có thể chứa constant không?",[437,1478,1479],{},"C# 8+ có (default member, static field). Java luôn cho. Best practice: hiếm dùng — constant thuộc enum hoặc static class.",[432,1481,1483,1484,1487,1488,1491],{"id":1482},"_60-override-equals-rồi-có-cần-override-gethashcode","60. Override ",[472,1485,1486],{},"Equals"," rồi có cần override ",[472,1489,1490],{},"GetHashCode","?",[437,1493,1494,1496,1497,1500,1501,1504],{},[493,1495,1471],{}," Hợp đồng: ",[472,1498,1499],{},"a.Equals(b)"," true → ",[472,1502,1503],{},"a.GetHashCode() == b.GetHashCode()",". Vi phạm → Dictionary\u002FHashSet hoạt động sai.",[432,1506,1508,1509,1512],{"id":1507},"_61-với-class-so-sánh-gì","61. ",[472,1510,1511],{},"=="," với class — so sánh gì?",[437,1514,1515,1516,1519],{},"Default: reference. Override hoặc dùng ",[472,1517,1518],{},"record"," (C# 9+) → so sánh value.",[432,1521,1523],{"id":1522},"_62-diamond-problem-giải-quyết-sao-trong-c","62. Diamond problem giải quyết sao trong C#?",[437,1525,1526],{},"Interface default member: nếu 2 base interface có cùng method default → class phải implement explicit để chọn hoặc viết riêng.",[1528,1529,1532,1533],"callout",{"color":1530,"icon":1531},"primary","i-lucide-arrow-right","Tiếp theo chủ đề: ",[645,1534,334],{"href":335},[1536,1537,1538],"style",{},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":840,"searchDepth":853,"depth":853,"links":1540},[1541,1548,1560,1567,1579,1584,1591,1597,1606,1612,1618],{"id":429,"depth":853,"text":430,"children":1542},[1543,1544,1545,1546],{"id":434,"depth":859,"text":435},{"id":442,"depth":859,"text":443},{"id":462,"depth":859,"text":463},{"id":469,"depth":859,"text":1547},"4. static member là gì?",{"id":481,"depth":853,"text":482,"children":1549},[1550,1551,1552,1553,1554,1555,1556,1557,1558],{"id":485,"depth":859,"text":486},{"id":543,"depth":859,"text":544},{"id":570,"depth":859,"text":571},{"id":588,"depth":859,"text":589},{"id":603,"depth":859,"text":604},{"id":614,"depth":859,"text":615},{"id":649,"depth":859,"text":650},{"id":660,"depth":859,"text":661},{"id":676,"depth":859,"text":1559},"13. virtual, abstract, sealed khác nhau?",{"id":711,"depth":853,"text":712,"children":1561},[1562,1563,1564,1565,1566],{"id":715,"depth":859,"text":716},{"id":791,"depth":859,"text":792},{"id":812,"depth":859,"text":813},{"id":819,"depth":859,"text":820},{"id":829,"depth":859,"text":830},{"id":871,"depth":853,"text":872,"children":1568},[1569,1570,1571,1572,1573,1574,1575,1576,1577,1578],{"id":875,"depth":859,"text":876},{"id":882,"depth":859,"text":883},{"id":905,"depth":859,"text":906},{"id":920,"depth":859,"text":921},{"id":942,"depth":859,"text":943},{"id":953,"depth":859,"text":954},{"id":980,"depth":859,"text":981},{"id":997,"depth":859,"text":998},{"id":1012,"depth":859,"text":1013},{"id":1030,"depth":859,"text":1031},{"id":1037,"depth":853,"text":1038,"children":1580},[1581,1582,1583],{"id":1041,"depth":859,"text":1042},{"id":1048,"depth":859,"text":1049},{"id":1063,"depth":859,"text":1064},{"id":1085,"depth":853,"text":1086,"children":1585},[1586,1587,1588,1589,1590],{"id":1089,"depth":859,"text":1090},{"id":1129,"depth":859,"text":1130},{"id":1136,"depth":859,"text":1137},{"id":1146,"depth":859,"text":1147},{"id":1153,"depth":859,"text":1154},{"id":1164,"depth":853,"text":1165,"children":1592},[1593,1594,1595,1596],{"id":1168,"depth":859,"text":1169},{"id":1183,"depth":859,"text":1184},{"id":1209,"depth":859,"text":1210},{"id":1222,"depth":859,"text":1223},{"id":1229,"depth":853,"text":1230,"children":1598},[1599,1600,1601,1602,1603,1604,1605],{"id":1233,"depth":859,"text":1234},{"id":1257,"depth":859,"text":1258},{"id":1269,"depth":859,"text":1270},{"id":1292,"depth":859,"text":1293},{"id":1304,"depth":859,"text":1305},{"id":1311,"depth":859,"text":1312},{"id":1325,"depth":859,"text":1326},{"id":1332,"depth":853,"text":1333,"children":1607},[1608,1609,1610,1611],{"id":1336,"depth":859,"text":1337},{"id":1347,"depth":859,"text":1348},{"id":1362,"depth":859,"text":1363},{"id":1377,"depth":859,"text":1378},{"id":1394,"depth":853,"text":1395,"children":1613},[1614,1615,1616,1617],{"id":1398,"depth":859,"text":1399},{"id":1405,"depth":859,"text":1406},{"id":1412,"depth":859,"text":1413},{"id":1431,"depth":859,"text":1432},{"id":1438,"depth":853,"text":1439,"children":1619},[1620,1622,1623,1624,1625,1627,1629],{"id":1442,"depth":859,"text":1621},"56. static method có thể override không?",{"id":1455,"depth":859,"text":1456},{"id":1465,"depth":859,"text":1466},{"id":1475,"depth":859,"text":1476},{"id":1482,"depth":859,"text":1626},"60. Override Equals rồi có cần override GetHashCode?",{"id":1507,"depth":859,"text":1628},"61. == với class — so sánh gì?",{"id":1522,"depth":859,"text":1523},"50+ câu hỏi OOP + SOLID + Design Pattern cho fresher\u002Fjunior — đáp án ngắn, ví dụ.","md",null,{},{"title":307,"icon":196},{"title":422,"description":1630},"AiguyDnhj5vnCjSrx1IcbZMvHlOSUlt4zM5j05Wkz14",[1638,1640],{"title":327,"path":328,"stem":329,"description":1639,"icon":106,"children":-1},"Creational (Singleton, Factory, Builder), Structural (Adapter, Decorator, Facade), Behavioral (Strategy, Observer, Command...). Ví dụ C# + TS.",{"title":334,"path":335,"stem":336,"description":1641,"icon":305,"children":-1},"Học Generic sâu — khái niệm, constraint, variance, so sánh reified (C#) vs erased (TS).",1783490358902]