[{"data":1,"prerenderedAt":1738},["ShallowReactive",2],{"navigation_docs":3,"-phong-van-lo-trinh-ngay-2-oop-solid":420,"-phong-van-lo-trinh-ngay-2-oop-solid-surround":1733},[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":37,"body":422,"description":1726,"extension":1727,"links":1728,"meta":1729,"navigation":1730,"path":38,"seo":1731,"stem":39,"__hash__":1732},"docs\u002F1.phong-van\u002F2.lo-trinh\u002F2.ngay-2-oop-solid.md",{"type":423,"value":424,"toc":1717},"minimark",[425,430,439,471,475,539,544,678,1426,1430,1660,1664,1713],[426,427,429],"h2",{"id":428},"mục-tiêu-ngày-2","Mục tiêu ngày 2",[431,432,433,434,438],"p",{},"OOP và SOLID là ",[435,436,437],"strong",{},"câu hỏi gần như 100% được hỏi"," ở phỏng vấn fresher .NET. Sau ngày 2 bạn phải:",[440,441,442,450,457,464],"ul",{},[443,444,445,446,449],"li",{},"Giải thích được ",[435,447,448],{},"4 tính chất OOP"," + cho ví dụ C# cụ thể.",[443,451,452,453,456],{},"Phân biệt rõ ",[435,454,455],{},"Interface vs Abstract class"," — khi nào dùng cái nào.",[443,458,459,460,463],{},"Đọc\u002Fviết ví dụ cho ",[435,461,462],{},"mỗi nguyên lý SOLID",".",[443,465,466,467],{},"Trả lời được: ",[468,469,470],"em",{},"\"Composition over Inheritance là gì?\"",[426,472,474],{"id":473},"_1-bốn-tính-chất-oop","1. Bốn tính chất OOP",[476,477,478,493,513,522],"field-group",{},[479,480,483,484,488,489,492],"field",{"name":481,"type":482},"Encapsulation","Đóng gói","Che giấu chi tiết bên trong, chỉ expose những gì cần. Dùng ",[485,486,487],"code",{},"private"," cho field, ",[485,490,491],{},"public"," cho property\u002Fmethod.",[479,494,497,498,501,502,505,506,509,510,463],{"name":495,"type":496},"Abstraction","Trừu tượng","Tách ",[468,499,500],{},"cái gì làm"," khỏi ",[468,503,504],{},"làm như thế nào",". Dùng ",[485,507,508],{},"interface"," hoặc ",[485,511,512],{},"abstract class",[479,514,517,518,521],{"name":515,"type":516},"Inheritance","Kế thừa","Class con dùng lại được code của class cha. Quan hệ \"",[435,519,520],{},"is-a","\".",[479,523,526,527,530,531,534,535,538],{"name":524,"type":525},"Polymorphism","Đa hình","Một interface, nhiều cách hiện thực. ",[485,528,529],{},"virtual","\u002F",[485,532,533],{},"override"," (runtime) và ",[485,536,537],{},"overload"," (compile-time).",[540,541,543],"h3",{"id":542},"code-ví-dụ-đủ-4-tính-chất","Code ví dụ đủ 4 tính chất",[545,546,551],"pre",{"className":547,"code":548,"language":549,"meta":550,"style":550},"language-csharp shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F 1. Abstraction — định nghĩa hành vi, không định nghĩa cách\npublic abstract class Animal {\n    public string Name { get; }                   \u002F\u002F 2. Encapsulation — set qua ctor\n    protected Animal(string name) => Name = name;\n    public abstract string Speak();               \u002F\u002F hành vi trừu tượng\n}\n\n\u002F\u002F 3. Inheritance — Dog \"is-a\" Animal\npublic class Dog : Animal {\n    public Dog(string name) : base(name) {}\n    public override string Speak() => \"Woof!\";    \u002F\u002F 4. Polymorphism — override\n}\n\npublic class Cat : Animal {\n    public Cat(string name) : base(name) {}\n    public override string Speak() => \"Meow!\";\n}\n\n\u002F\u002F Sử dụng đa hình:\nAnimal[] zoo = { new Dog(\"Rex\"), new Cat(\"Tom\") };\nforeach (var a in zoo) Console.WriteLine($\"{a.Name}: {a.Speak()}\");\n","csharp","",[485,552,553,561,567,573,579,585,591,598,604,610,616,622,627,632,638,644,650,655,660,666,672],{"__ignoreMap":550},[554,555,558],"span",{"class":556,"line":557},"line",1,[554,559,560],{},"\u002F\u002F 1. Abstraction — định nghĩa hành vi, không định nghĩa cách\n",[554,562,564],{"class":556,"line":563},2,[554,565,566],{},"public abstract class Animal {\n",[554,568,570],{"class":556,"line":569},3,[554,571,572],{},"    public string Name { get; }                   \u002F\u002F 2. Encapsulation — set qua ctor\n",[554,574,576],{"class":556,"line":575},4,[554,577,578],{},"    protected Animal(string name) => Name = name;\n",[554,580,582],{"class":556,"line":581},5,[554,583,584],{},"    public abstract string Speak();               \u002F\u002F hành vi trừu tượng\n",[554,586,588],{"class":556,"line":587},6,[554,589,590],{},"}\n",[554,592,594],{"class":556,"line":593},7,[554,595,597],{"emptyLinePlaceholder":596},true,"\n",[554,599,601],{"class":556,"line":600},8,[554,602,603],{},"\u002F\u002F 3. Inheritance — Dog \"is-a\" Animal\n",[554,605,607],{"class":556,"line":606},9,[554,608,609],{},"public class Dog : Animal {\n",[554,611,613],{"class":556,"line":612},10,[554,614,615],{},"    public Dog(string name) : base(name) {}\n",[554,617,619],{"class":556,"line":618},11,[554,620,621],{},"    public override string Speak() => \"Woof!\";    \u002F\u002F 4. Polymorphism — override\n",[554,623,625],{"class":556,"line":624},12,[554,626,590],{},[554,628,630],{"class":556,"line":629},13,[554,631,597],{"emptyLinePlaceholder":596},[554,633,635],{"class":556,"line":634},14,[554,636,637],{},"public class Cat : Animal {\n",[554,639,641],{"class":556,"line":640},15,[554,642,643],{},"    public Cat(string name) : base(name) {}\n",[554,645,647],{"class":556,"line":646},16,[554,648,649],{},"    public override string Speak() => \"Meow!\";\n",[554,651,653],{"class":556,"line":652},17,[554,654,590],{},[554,656,658],{"class":556,"line":657},18,[554,659,597],{"emptyLinePlaceholder":596},[554,661,663],{"class":556,"line":662},19,[554,664,665],{},"\u002F\u002F Sử dụng đa hình:\n",[554,667,669],{"class":556,"line":668},20,[554,670,671],{},"Animal[] zoo = { new Dog(\"Rex\"), new Cat(\"Tom\") };\n",[554,673,675],{"class":556,"line":674},21,[554,676,677],{},"foreach (var a in zoo) Console.WriteLine($\"{a.Name}: {a.Speak()}\");\n",[679,680,682,691,711,715,805,870],"callout",{"color":681,"icon":196},"primary",[431,683,684,687,688],{},[435,685,686],{},"Câu hỏi mẫu:"," ",[468,689,690],{},"\"Đa hình runtime khác compile-time chỗ nào?\"",[440,692,693,699],{},[443,694,695,698],{},[435,696,697],{},"Compile-time (Method Overloading)",": cùng tên, khác signature — quyết định khi build.",[443,700,701,704,705,707,708,710],{},[435,702,703],{},"Runtime (Method Overriding)",": ",[485,706,529],{}," ở cha, ",[485,709,533],{}," ở con — quyết định khi chạy qua bảng vtable.\n::",[426,712,714],{"id":713},"_2-interface-vs-abstract-class","2. Interface vs Abstract class",[716,717,718,736],"table",{},[719,720,721],"thead",{},[722,723,724,728,732],"tr",{},[725,726,727],"th",{},"Khía cạnh",[725,729,730],{},[485,731,508],{},[725,733,734],{},[485,735,512],{},[737,738,739,756,767,777,788],"tbody",{},[722,740,741,744,750],{},[742,743,516],"td",{},[742,745,746,747],{},"Class implements ",[435,748,749],{},"nhiều",[742,751,752,753],{},"Class extends ",[435,754,755],{},"1 duy nhất",[722,757,758,761,764],{},[742,759,760],{},"Field\u002Fstate",[742,762,763],{},"❌ Không (đến C# 8 mới có default member)",[742,765,766],{},"✅ Có",[722,768,769,772,775],{},[742,770,771],{},"Constructor",[742,773,774],{},"❌ Không",[742,776,766],{},[722,778,779,782,785],{},[742,780,781],{},"Access modifier",[742,783,784],{},"Mặc định public",[742,786,787],{},"Đa dạng",[722,789,790,793,799],{},[742,791,792],{},"Mục đích",[742,794,795,798],{},[435,796,797],{},"Capability"," (\"can do X\")",[742,800,801,804],{},[435,802,803],{},"Type \u002F Bản chất"," (\"is-a\")",[545,806,808],{"className":547,"code":807,"language":549,"meta":550,"style":550},"\u002F\u002F Capability — bất kỳ thứ gì cũng có thể bay\npublic interface IFlyable { void Fly(); }\n\n\u002F\u002F Bản chất — Bird LÀ một Animal\npublic abstract class Animal {\n    public string Name { get; protected set; }\n    public abstract void Eat();\n}\n\npublic class Bird : Animal, IFlyable {\n    public override void Eat() => Console.WriteLine(\"Eat seeds\");\n    public void Fly() => Console.WriteLine(\"Flapping wings\");\n}\n",[485,809,810,815,820,824,829,833,838,843,847,851,856,861,866],{"__ignoreMap":550},[554,811,812],{"class":556,"line":557},[554,813,814],{},"\u002F\u002F Capability — bất kỳ thứ gì cũng có thể bay\n",[554,816,817],{"class":556,"line":563},[554,818,819],{},"public interface IFlyable { void Fly(); }\n",[554,821,822],{"class":556,"line":569},[554,823,597],{"emptyLinePlaceholder":596},[554,825,826],{"class":556,"line":575},[554,827,828],{},"\u002F\u002F Bản chất — Bird LÀ một Animal\n",[554,830,831],{"class":556,"line":581},[554,832,566],{},[554,834,835],{"class":556,"line":587},[554,836,837],{},"    public string Name { get; protected set; }\n",[554,839,840],{"class":556,"line":593},[554,841,842],{},"    public abstract void Eat();\n",[554,844,845],{"class":556,"line":600},[554,846,590],{},[554,848,849],{"class":556,"line":606},[554,850,597],{"emptyLinePlaceholder":596},[554,852,853],{"class":556,"line":612},[554,854,855],{},"public class Bird : Animal, IFlyable {\n",[554,857,858],{"class":556,"line":618},[554,859,860],{},"    public override void Eat() => Console.WriteLine(\"Eat seeds\");\n",[554,862,863],{"class":556,"line":624},[554,864,865],{},"    public void Fly() => Console.WriteLine(\"Flapping wings\");\n",[554,867,868],{"class":556,"line":629},[554,869,590],{},[679,871,874,879,912,916,974,980,984,988,997,1060,1064,1076,1154,1158,1163,1220,1224,1229,1321,1325,1337,1411],{"color":872,"icon":873},"warning","i-lucide-lightbulb",[431,875,876],{},[435,877,878],{},"Quy tắc thực dụng:",[440,880,881,890,898,903],{},[443,882,883,884,887,888,463],{},"Cần share ",[435,885,886],{},"code (method có body, field)"," → ",[485,889,512],{},[443,891,892,893,887,896,463],{},"Chỉ cần share ",[435,894,895],{},"hợp đồng (signature)",[485,897,508],{},[443,899,900,901,463],{},"Multiple inheritance → ",[485,902,508],{},[443,904,905,906,911],{},"Trong .NET hiện đại, ",[435,907,908,909],{},"ưu tiên ",[485,910,508],{}," + composition cho dễ test (mock).\n::",[426,913,915],{"id":914},"_3-composition-over-inheritance","3. Composition over Inheritance",[545,917,919],{"className":547,"code":918,"language":549,"meta":550,"style":550},"\u002F\u002F ❌ Lạm dụng kế thừa — Square IS-A Rectangle? Vi phạm LSP nếu Setter có side-effect\npublic class Rectangle { public virtual int Width { get; set; } ... }\npublic class Square : Rectangle { \u002F* phải override cả Width và Height *\u002F }\n\n\u002F\u002F ✅ Composition — Car HAS-A Engine\npublic class Engine { public void Start() {} }\npublic class Car {\n    private readonly Engine _engine;\n    public Car(Engine engine) => _engine = engine;\n    public void Drive() { _engine.Start(); }\n}\n",[485,920,921,926,931,936,940,945,950,955,960,965,970],{"__ignoreMap":550},[554,922,923],{"class":556,"line":557},[554,924,925],{},"\u002F\u002F ❌ Lạm dụng kế thừa — Square IS-A Rectangle? Vi phạm LSP nếu Setter có side-effect\n",[554,927,928],{"class":556,"line":563},[554,929,930],{},"public class Rectangle { public virtual int Width { get; set; } ... }\n",[554,932,933],{"class":556,"line":569},[554,934,935],{},"public class Square : Rectangle { \u002F* phải override cả Width và Height *\u002F }\n",[554,937,938],{"class":556,"line":575},[554,939,597],{"emptyLinePlaceholder":596},[554,941,942],{"class":556,"line":581},[554,943,944],{},"\u002F\u002F ✅ Composition — Car HAS-A Engine\n",[554,946,947],{"class":556,"line":587},[554,948,949],{},"public class Engine { public void Start() {} }\n",[554,951,952],{"class":556,"line":593},[554,953,954],{},"public class Car {\n",[554,956,957],{"class":556,"line":600},[554,958,959],{},"    private readonly Engine _engine;\n",[554,961,962],{"class":556,"line":606},[554,963,964],{},"    public Car(Engine engine) => _engine = engine;\n",[554,966,967],{"class":556,"line":612},[554,968,969],{},"    public void Drive() { _engine.Start(); }\n",[554,971,972],{"class":556,"line":618},[554,973,590],{},[431,975,976,977,463],{},"→ Dễ thay đổi: muốn Car chạy điện, chỉ cần inject ",[485,978,979],{},"ElectricEngine : IEngine",[426,981,983],{"id":982},"_4-solid-5-nguyên-lý","4. SOLID — 5 nguyên lý",[540,985,987],{"id":986},"s-single-responsibility-principle","S — Single Responsibility Principle",[989,990,991],"blockquote",{},[431,992,993,994,463],{},"Một class chỉ có ",[435,995,996],{},"một lý do để thay đổi",[545,998,1000],{"className":547,"code":999,"language":549,"meta":550,"style":550},"\u002F\u002F ❌ Class này có 3 lý do để đổi: thay đổi format hóa đơn, đổi cách tính thuế, đổi cách gửi mail\npublic class Invoice {\n    public string Format() {...}\n    public decimal CalculateTax() {...}\n    public void SendByEmail() {...}\n}\n\n\u002F\u002F ✅ Tách ra\npublic class Invoice { public decimal Total { get; set; } }\npublic class InvoiceFormatter { public string Format(Invoice i) {...} }\npublic class TaxCalculator { public decimal Calc(Invoice i) {...} }\npublic class InvoiceEmailService { public void Send(Invoice i) {...} }\n",[485,1001,1002,1007,1012,1017,1022,1027,1031,1035,1040,1045,1050,1055],{"__ignoreMap":550},[554,1003,1004],{"class":556,"line":557},[554,1005,1006],{},"\u002F\u002F ❌ Class này có 3 lý do để đổi: thay đổi format hóa đơn, đổi cách tính thuế, đổi cách gửi mail\n",[554,1008,1009],{"class":556,"line":563},[554,1010,1011],{},"public class Invoice {\n",[554,1013,1014],{"class":556,"line":569},[554,1015,1016],{},"    public string Format() {...}\n",[554,1018,1019],{"class":556,"line":575},[554,1020,1021],{},"    public decimal CalculateTax() {...}\n",[554,1023,1024],{"class":556,"line":581},[554,1025,1026],{},"    public void SendByEmail() {...}\n",[554,1028,1029],{"class":556,"line":587},[554,1030,590],{},[554,1032,1033],{"class":556,"line":593},[554,1034,597],{"emptyLinePlaceholder":596},[554,1036,1037],{"class":556,"line":600},[554,1038,1039],{},"\u002F\u002F ✅ Tách ra\n",[554,1041,1042],{"class":556,"line":606},[554,1043,1044],{},"public class Invoice { public decimal Total { get; set; } }\n",[554,1046,1047],{"class":556,"line":612},[554,1048,1049],{},"public class InvoiceFormatter { public string Format(Invoice i) {...} }\n",[554,1051,1052],{"class":556,"line":618},[554,1053,1054],{},"public class TaxCalculator { public decimal Calc(Invoice i) {...} }\n",[554,1056,1057],{"class":556,"line":624},[554,1058,1059],{},"public class InvoiceEmailService { public void Send(Invoice i) {...} }\n",[540,1061,1063],{"id":1062},"o-openclosed-principle","O — Open\u002FClosed Principle",[989,1065,1066],{},[431,1067,1068,1069,1072,1073,463],{},"Class ",[435,1070,1071],{},"mở để mở rộng",", ",[435,1074,1075],{},"đóng để sửa đổi",[545,1077,1079],{"className":547,"code":1078,"language":549,"meta":550,"style":550},"\u002F\u002F ❌ Mỗi khi thêm shape mới phải sửa AreaCalculator\npublic class AreaCalculator {\n    public double Area(object shape) {\n        if (shape is Rectangle r) return r.W * r.H;\n        if (shape is Circle c) return Math.PI * c.R * c.R;\n        \u002F\u002F Thêm Triangle? PHẢI SỬA file này.\n        throw new ArgumentException();\n    }\n}\n\n\u002F\u002F ✅ Thêm shape mới chỉ cần tạo class mới, không động AreaCalculator\npublic abstract class Shape { public abstract double Area(); }\npublic class Rectangle : Shape { public override double Area() => W * H; }\npublic class Circle    : Shape { public override double Area() => Math.PI * R * R; }\npublic class Triangle  : Shape { public override double Area() => 0.5 * B * H; }\n",[485,1080,1081,1086,1091,1096,1101,1106,1111,1116,1121,1125,1129,1134,1139,1144,1149],{"__ignoreMap":550},[554,1082,1083],{"class":556,"line":557},[554,1084,1085],{},"\u002F\u002F ❌ Mỗi khi thêm shape mới phải sửa AreaCalculator\n",[554,1087,1088],{"class":556,"line":563},[554,1089,1090],{},"public class AreaCalculator {\n",[554,1092,1093],{"class":556,"line":569},[554,1094,1095],{},"    public double Area(object shape) {\n",[554,1097,1098],{"class":556,"line":575},[554,1099,1100],{},"        if (shape is Rectangle r) return r.W * r.H;\n",[554,1102,1103],{"class":556,"line":581},[554,1104,1105],{},"        if (shape is Circle c) return Math.PI * c.R * c.R;\n",[554,1107,1108],{"class":556,"line":587},[554,1109,1110],{},"        \u002F\u002F Thêm Triangle? PHẢI SỬA file này.\n",[554,1112,1113],{"class":556,"line":593},[554,1114,1115],{},"        throw new ArgumentException();\n",[554,1117,1118],{"class":556,"line":600},[554,1119,1120],{},"    }\n",[554,1122,1123],{"class":556,"line":606},[554,1124,590],{},[554,1126,1127],{"class":556,"line":612},[554,1128,597],{"emptyLinePlaceholder":596},[554,1130,1131],{"class":556,"line":618},[554,1132,1133],{},"\u002F\u002F ✅ Thêm shape mới chỉ cần tạo class mới, không động AreaCalculator\n",[554,1135,1136],{"class":556,"line":624},[554,1137,1138],{},"public abstract class Shape { public abstract double Area(); }\n",[554,1140,1141],{"class":556,"line":629},[554,1142,1143],{},"public class Rectangle : Shape { public override double Area() => W * H; }\n",[554,1145,1146],{"class":556,"line":634},[554,1147,1148],{},"public class Circle    : Shape { public override double Area() => Math.PI * R * R; }\n",[554,1150,1151],{"class":556,"line":640},[554,1152,1153],{},"public class Triangle  : Shape { public override double Area() => 0.5 * B * H; }\n",[540,1155,1157],{"id":1156},"l-liskov-substitution-principle","L — Liskov Substitution Principle",[989,1159,1160],{},[431,1161,1162],{},"Subclass phải dùng được thay cho superclass mà không phá vỡ chương trình.",[545,1164,1166],{"className":547,"code":1165,"language":549,"meta":550,"style":550},"\u002F\u002F ❌ Vi phạm — Penguin không bay được mà vẫn là Bird có Fly()\npublic class Bird { public virtual void Fly() {...} }\npublic class Penguin : Bird {\n    public override void Fly() => throw new NotSupportedException();\n}\n\n\u002F\u002F ✅ Phân tách\npublic abstract class Bird {}\npublic interface IFlyable { void Fly(); }\npublic class Sparrow : Bird, IFlyable { public void Fly() {} }\npublic class Penguin : Bird { \u002F* không IFlyable *\u002F }\n",[485,1167,1168,1173,1178,1183,1188,1192,1196,1201,1206,1210,1215],{"__ignoreMap":550},[554,1169,1170],{"class":556,"line":557},[554,1171,1172],{},"\u002F\u002F ❌ Vi phạm — Penguin không bay được mà vẫn là Bird có Fly()\n",[554,1174,1175],{"class":556,"line":563},[554,1176,1177],{},"public class Bird { public virtual void Fly() {...} }\n",[554,1179,1180],{"class":556,"line":569},[554,1181,1182],{},"public class Penguin : Bird {\n",[554,1184,1185],{"class":556,"line":575},[554,1186,1187],{},"    public override void Fly() => throw new NotSupportedException();\n",[554,1189,1190],{"class":556,"line":581},[554,1191,590],{},[554,1193,1194],{"class":556,"line":587},[554,1195,597],{"emptyLinePlaceholder":596},[554,1197,1198],{"class":556,"line":593},[554,1199,1200],{},"\u002F\u002F ✅ Phân tách\n",[554,1202,1203],{"class":556,"line":600},[554,1204,1205],{},"public abstract class Bird {}\n",[554,1207,1208],{"class":556,"line":606},[554,1209,819],{},[554,1211,1212],{"class":556,"line":612},[554,1213,1214],{},"public class Sparrow : Bird, IFlyable { public void Fly() {} }\n",[554,1216,1217],{"class":556,"line":618},[554,1218,1219],{},"public class Penguin : Bird { \u002F* không IFlyable *\u002F }\n",[540,1221,1223],{"id":1222},"i-interface-segregation-principle","I — Interface Segregation Principle",[989,1225,1226],{},[431,1227,1228],{},"Không bắt class implement những method nó không cần.",[545,1230,1232],{"className":547,"code":1231,"language":549,"meta":550,"style":550},"\u002F\u002F ❌ \"Fat\" interface\npublic interface IWorker {\n    void Work();\n    void Eat();\n    void Sleep();\n}\npublic class Robot : IWorker {\n    public void Work() {}\n    public void Eat()   => throw new NotSupportedException(); \u002F\u002F 🚫\n    public void Sleep() => throw new NotSupportedException();\n}\n\n\u002F\u002F ✅ Tách nhỏ\npublic interface IWorkable { void Work(); }\npublic interface IFeedable  { void Eat(); }\npublic interface ISleepable { void Sleep(); }\npublic class Robot  : IWorkable {}\npublic class Human  : IWorkable, IFeedable, ISleepable {}\n",[485,1233,1234,1239,1244,1249,1254,1259,1263,1268,1273,1278,1283,1287,1291,1296,1301,1306,1311,1316],{"__ignoreMap":550},[554,1235,1236],{"class":556,"line":557},[554,1237,1238],{},"\u002F\u002F ❌ \"Fat\" interface\n",[554,1240,1241],{"class":556,"line":563},[554,1242,1243],{},"public interface IWorker {\n",[554,1245,1246],{"class":556,"line":569},[554,1247,1248],{},"    void Work();\n",[554,1250,1251],{"class":556,"line":575},[554,1252,1253],{},"    void Eat();\n",[554,1255,1256],{"class":556,"line":581},[554,1257,1258],{},"    void Sleep();\n",[554,1260,1261],{"class":556,"line":587},[554,1262,590],{},[554,1264,1265],{"class":556,"line":593},[554,1266,1267],{},"public class Robot : IWorker {\n",[554,1269,1270],{"class":556,"line":600},[554,1271,1272],{},"    public void Work() {}\n",[554,1274,1275],{"class":556,"line":606},[554,1276,1277],{},"    public void Eat()   => throw new NotSupportedException(); \u002F\u002F 🚫\n",[554,1279,1280],{"class":556,"line":612},[554,1281,1282],{},"    public void Sleep() => throw new NotSupportedException();\n",[554,1284,1285],{"class":556,"line":618},[554,1286,590],{},[554,1288,1289],{"class":556,"line":624},[554,1290,597],{"emptyLinePlaceholder":596},[554,1292,1293],{"class":556,"line":629},[554,1294,1295],{},"\u002F\u002F ✅ Tách nhỏ\n",[554,1297,1298],{"class":556,"line":634},[554,1299,1300],{},"public interface IWorkable { void Work(); }\n",[554,1302,1303],{"class":556,"line":640},[554,1304,1305],{},"public interface IFeedable  { void Eat(); }\n",[554,1307,1308],{"class":556,"line":646},[554,1309,1310],{},"public interface ISleepable { void Sleep(); }\n",[554,1312,1313],{"class":556,"line":652},[554,1314,1315],{},"public class Robot  : IWorkable {}\n",[554,1317,1318],{"class":556,"line":657},[554,1319,1320],{},"public class Human  : IWorkable, IFeedable, ISleepable {}\n",[540,1322,1324],{"id":1323},"d-dependency-inversion-principle","D — Dependency Inversion Principle",[989,1326,1327],{},[431,1328,1329,1330,1333,1334,463],{},"Module cấp cao ",[435,1331,1332],{},"không phụ thuộc"," module cấp thấp. Cả hai cùng phụ thuộc ",[435,1335,1336],{},"abstraction",[545,1338,1340],{"className":547,"code":1339,"language":549,"meta":550,"style":550},"\u002F\u002F ❌ OrderService gắn cứng với SqlServerRepo\npublic class OrderService {\n    private SqlServerRepo _repo = new SqlServerRepo();\n}\n\n\u002F\u002F ✅ Phụ thuộc interface, repo được inject vào\npublic interface IOrderRepository { void Save(Order o); }\n\npublic class SqlServerRepo : IOrderRepository { public void Save(Order o) {...} }\npublic class MongoRepo     : IOrderRepository { public void Save(Order o) {...} }\n\npublic class OrderService {\n    private readonly IOrderRepository _repo;\n    public OrderService(IOrderRepository repo) => _repo = repo; \u002F\u002F DI\n}\n",[485,1341,1342,1347,1352,1357,1361,1365,1370,1375,1379,1384,1389,1393,1397,1402,1407],{"__ignoreMap":550},[554,1343,1344],{"class":556,"line":557},[554,1345,1346],{},"\u002F\u002F ❌ OrderService gắn cứng với SqlServerRepo\n",[554,1348,1349],{"class":556,"line":563},[554,1350,1351],{},"public class OrderService {\n",[554,1353,1354],{"class":556,"line":569},[554,1355,1356],{},"    private SqlServerRepo _repo = new SqlServerRepo();\n",[554,1358,1359],{"class":556,"line":575},[554,1360,590],{},[554,1362,1363],{"class":556,"line":581},[554,1364,597],{"emptyLinePlaceholder":596},[554,1366,1367],{"class":556,"line":587},[554,1368,1369],{},"\u002F\u002F ✅ Phụ thuộc interface, repo được inject vào\n",[554,1371,1372],{"class":556,"line":593},[554,1373,1374],{},"public interface IOrderRepository { void Save(Order o); }\n",[554,1376,1377],{"class":556,"line":600},[554,1378,597],{"emptyLinePlaceholder":596},[554,1380,1381],{"class":556,"line":606},[554,1382,1383],{},"public class SqlServerRepo : IOrderRepository { public void Save(Order o) {...} }\n",[554,1385,1386],{"class":556,"line":612},[554,1387,1388],{},"public class MongoRepo     : IOrderRepository { public void Save(Order o) {...} }\n",[554,1390,1391],{"class":556,"line":618},[554,1392,597],{"emptyLinePlaceholder":596},[554,1394,1395],{"class":556,"line":624},[554,1396,1351],{},[554,1398,1399],{"class":556,"line":629},[554,1400,1401],{},"    private readonly IOrderRepository _repo;\n",[554,1403,1404],{"class":556,"line":634},[554,1405,1406],{},"    public OrderService(IOrderRepository repo) => _repo = repo; \u002F\u002F DI\n",[554,1408,1409],{"class":556,"line":640},[554,1410,590],{},[679,1412,1414,1417,1418,1421,1422,1425],{"color":1413,"icon":268},"success",[435,1415,1416],{},"Mối liên hệ DIP ↔ DI:"," Dependency Inversion là ",[435,1419,1420],{},"nguyên lý",", Dependency Injection là ",[435,1423,1424],{},"kỹ thuật"," để thực thi nguyên lý đó (constructor \u002F setter \u002F framework như ASP.NET Core).",[426,1427,1429],{"id":1428},"_5-design-pattern-fresher-hay-được-hỏi","5. Design pattern fresher hay được hỏi",[1431,1432,1433,1482,1544,1600],"tabs",{},[1434,1435,1438,1472],"div",{"icon":1436,"label":1437},"i-lucide-box","Singleton",[545,1439,1441],{"className":547,"code":1440,"language":549,"meta":550,"style":550},"public sealed class Logger {\n    private static readonly Lazy\u003CLogger> _instance = new(() => new Logger());\n    public static Logger Instance => _instance.Value;\n    private Logger() {}\n    public void Log(string msg) { \u002F*...*\u002F }\n}\n",[485,1442,1443,1448,1453,1458,1463,1468],{"__ignoreMap":550},[554,1444,1445],{"class":556,"line":557},[554,1446,1447],{},"public sealed class Logger {\n",[554,1449,1450],{"class":556,"line":563},[554,1451,1452],{},"    private static readonly Lazy\u003CLogger> _instance = new(() => new Logger());\n",[554,1454,1455],{"class":556,"line":569},[554,1456,1457],{},"    public static Logger Instance => _instance.Value;\n",[554,1459,1460],{"class":556,"line":575},[554,1461,1462],{},"    private Logger() {}\n",[554,1464,1465],{"class":556,"line":581},[554,1466,1467],{},"    public void Log(string msg) { \u002F*...*\u002F }\n",[554,1469,1470],{"class":556,"line":587},[554,1471,590],{},[431,1473,1474,1477,1478,1481],{},[435,1475,1476],{},"Trong ASP.NET Core",": dùng ",[485,1479,1480],{},"services.AddSingleton\u003CILogger, Logger>()"," thay vì viết tay.",[1434,1483,1486],{"icon":1484,"label":1485},"i-lucide-factory","Factory",[545,1487,1489],{"className":547,"code":1488,"language":549,"meta":550,"style":550},"public interface IShape { void Draw(); }\npublic class Circle : IShape  { public void Draw() {} }\npublic class Square : IShape  { public void Draw() {} }\n\npublic class ShapeFactory {\n    public IShape Create(string type) => type switch {\n        \"circle\" => new Circle(),\n        \"square\" => new Square(),\n        _ => throw new ArgumentException()\n    };\n}\n",[485,1490,1491,1496,1501,1506,1510,1515,1520,1525,1530,1535,1540],{"__ignoreMap":550},[554,1492,1493],{"class":556,"line":557},[554,1494,1495],{},"public interface IShape { void Draw(); }\n",[554,1497,1498],{"class":556,"line":563},[554,1499,1500],{},"public class Circle : IShape  { public void Draw() {} }\n",[554,1502,1503],{"class":556,"line":569},[554,1504,1505],{},"public class Square : IShape  { public void Draw() {} }\n",[554,1507,1508],{"class":556,"line":575},[554,1509,597],{"emptyLinePlaceholder":596},[554,1511,1512],{"class":556,"line":581},[554,1513,1514],{},"public class ShapeFactory {\n",[554,1516,1517],{"class":556,"line":587},[554,1518,1519],{},"    public IShape Create(string type) => type switch {\n",[554,1521,1522],{"class":556,"line":593},[554,1523,1524],{},"        \"circle\" => new Circle(),\n",[554,1526,1527],{"class":556,"line":600},[554,1528,1529],{},"        \"square\" => new Square(),\n",[554,1531,1532],{"class":556,"line":606},[554,1533,1534],{},"        _ => throw new ArgumentException()\n",[554,1536,1537],{"class":556,"line":612},[554,1538,1539],{},"    };\n",[554,1541,1542],{"class":556,"line":618},[554,1543,590],{},[1434,1545,1547],{"icon":371,"label":1546},"Strategy",[545,1548,1550],{"className":547,"code":1549,"language":549,"meta":550,"style":550},"public interface IDiscount { decimal Apply(decimal price); }\npublic class NoDiscount     : IDiscount { public decimal Apply(decimal p) => p; }\npublic class TenPercent     : IDiscount { public decimal Apply(decimal p) => p * 0.9m; }\npublic class StudentDiscount: IDiscount { public decimal Apply(decimal p) => p * 0.7m; }\n\npublic class Cart {\n    private readonly IDiscount _strategy;\n    public Cart(IDiscount strategy) => _strategy = strategy;\n    public decimal Checkout(decimal total) => _strategy.Apply(total);\n}\n",[485,1551,1552,1557,1562,1567,1572,1576,1581,1586,1591,1596],{"__ignoreMap":550},[554,1553,1554],{"class":556,"line":557},[554,1555,1556],{},"public interface IDiscount { decimal Apply(decimal price); }\n",[554,1558,1559],{"class":556,"line":563},[554,1560,1561],{},"public class NoDiscount     : IDiscount { public decimal Apply(decimal p) => p; }\n",[554,1563,1564],{"class":556,"line":569},[554,1565,1566],{},"public class TenPercent     : IDiscount { public decimal Apply(decimal p) => p * 0.9m; }\n",[554,1568,1569],{"class":556,"line":575},[554,1570,1571],{},"public class StudentDiscount: IDiscount { public decimal Apply(decimal p) => p * 0.7m; }\n",[554,1573,1574],{"class":556,"line":581},[554,1575,597],{"emptyLinePlaceholder":596},[554,1577,1578],{"class":556,"line":587},[554,1579,1580],{},"public class Cart {\n",[554,1582,1583],{"class":556,"line":593},[554,1584,1585],{},"    private readonly IDiscount _strategy;\n",[554,1587,1588],{"class":556,"line":600},[554,1589,1590],{},"    public Cart(IDiscount strategy) => _strategy = strategy;\n",[554,1592,1593],{"class":556,"line":606},[554,1594,1595],{},"    public decimal Checkout(decimal total) => _strategy.Apply(total);\n",[554,1597,1598],{"class":556,"line":612},[554,1599,590],{},[1434,1601,1603],{"icon":68,"label":1602},"Repository",[545,1604,1606],{"className":547,"code":1605,"language":549,"meta":550,"style":550},"public interface IUserRepository {\n    Task\u003CUser?> GetByIdAsync(int id);\n    Task AddAsync(User u);\n}\n\npublic class EfUserRepository : IUserRepository {\n    private readonly AppDbContext _ctx;\n    public EfUserRepository(AppDbContext ctx) => _ctx = ctx;\n    public Task\u003CUser?> GetByIdAsync(int id) => _ctx.Users.FindAsync(id).AsTask();\n    public async Task AddAsync(User u) { _ctx.Users.Add(u); await _ctx.SaveChangesAsync(); }\n}\n",[485,1607,1608,1613,1618,1623,1627,1631,1636,1641,1646,1651,1656],{"__ignoreMap":550},[554,1609,1610],{"class":556,"line":557},[554,1611,1612],{},"public interface IUserRepository {\n",[554,1614,1615],{"class":556,"line":563},[554,1616,1617],{},"    Task\u003CUser?> GetByIdAsync(int id);\n",[554,1619,1620],{"class":556,"line":569},[554,1621,1622],{},"    Task AddAsync(User u);\n",[554,1624,1625],{"class":556,"line":575},[554,1626,590],{},[554,1628,1629],{"class":556,"line":581},[554,1630,597],{"emptyLinePlaceholder":596},[554,1632,1633],{"class":556,"line":587},[554,1634,1635],{},"public class EfUserRepository : IUserRepository {\n",[554,1637,1638],{"class":556,"line":593},[554,1639,1640],{},"    private readonly AppDbContext _ctx;\n",[554,1642,1643],{"class":556,"line":600},[554,1644,1645],{},"    public EfUserRepository(AppDbContext ctx) => _ctx = ctx;\n",[554,1647,1648],{"class":556,"line":606},[554,1649,1650],{},"    public Task\u003CUser?> GetByIdAsync(int id) => _ctx.Users.FindAsync(id).AsTask();\n",[554,1652,1653],{"class":556,"line":612},[554,1654,1655],{},"    public async Task AddAsync(User u) { _ctx.Users.Add(u); await _ctx.SaveChangesAsync(); }\n",[554,1657,1658],{"class":556,"line":618},[554,1659,590],{},[426,1661,1663],{"id":1662},"_6-câu-hỏi-tự-test-cuối-ngày","6. Câu hỏi tự test cuối ngày",[679,1665,1667,1695,1705,1708],{"color":681,"icon":1666},"i-lucide-help-circle",[1668,1669,1670,1673,1683,1686,1689,1692],"ol",{},[443,1671,1672],{},"Cho ví dụ Encapsulation trong code mình từng viết.",[443,1674,1675,1678,1679,1682],{},[485,1676,1677],{},"abstract method"," và ",[485,1680,1681],{},"virtual method"," khác nhau chỗ nào?",[443,1684,1685],{},"C# có hỗ trợ đa kế thừa class không? Còn interface?",[443,1687,1688],{},"SOLID nào quan trọng nhất với fresher? Vì sao?",[443,1690,1691],{},"Trong ASP.NET Core, DIP được áp dụng ở đâu?",[443,1693,1694],{},"Pattern nào hay dùng cho data access? (→ Repository)\n::",[431,1696,1697,1700,1701,463],{},[435,1698,1699],{},"Đáp án chi tiết:"," xem ",[1702,1703,1704],"a",{"href":79},"Ngân hàng câu hỏi OOP",[1706,1707],"hr",{},[431,1709,1710,1711],{},"➡️ Ngày mai: ",[1702,1712,42],{"href":43},[1714,1715,1716],"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":550,"searchDepth":563,"depth":563,"links":1718},[1719,1720,1723,1724,1725],{"id":428,"depth":563,"text":429},{"id":473,"depth":563,"text":474,"children":1721},[1722],{"id":542,"depth":569,"text":543},{"id":713,"depth":563,"text":714},{"id":1428,"depth":563,"text":1429},{"id":1662,"depth":563,"text":1663},"4 tính chất OOP, Interface vs Abstract class, 5 nguyên lý SOLID kèm ví dụ C Sharp.","md",null,{},{"title":37,"icon":40},{"title":37,"description":1726},"qQ73liXUoVkx_Ev2--OMFb-i6e3FIwFdqen8JzX623A",[1734,1736],{"title":32,"path":33,"stem":34,"description":1735,"icon":35,"children":-1},"Stack\u002Fheap, value vs reference type, boxing\u002Funboxing, string\u002FStringBuilder, exception. Giải thích từ con số 0 cho intern → kiến thức nâng cao cho senior.",{"title":42,"path":43,"stem":44,"description":1737,"icon":45,"children":-1},"Generic internals, LINQ deferred execution, async\u002Fawait state machine, delegate vs event, extension method. Giải thích sâu cho mọi level.",1783490353052]