{"id":1453,"date":"2023-04-10T08:47:10","date_gmt":"2023-04-10T01:47:10","guid":{"rendered":"https:\/\/csharptutorial.net\/?page_id=1453"},"modified":"2024-12-14T22:31:06","modified_gmt":"2024-12-14T15:31:06","slug":"csharp-open-closed-principle","status":"publish","type":"page","link":"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-open-closed-principle\/","title":{"rendered":"C# Open-closed Principle"},"content":{"rendered":"\n<p><strong>Summary<\/strong>: in this tutorial, you&#8217;ll learn about the C# open-closed principle and how to use it to write code that is open for extension and closed for modification.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Introduction to the C# Open-closed principle<\/h2>\n\n\n\n<p>The Open-closed Principle (OCP) is the second principle of the SOLID principles of object-oriented design:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/csharptutorial.net\/csharp-design-patterns\/csharp-single-responsibility-principle\/\">Single Responsibility Principle (SRP)<\/a><\/li>\n\n\n\n<li><strong>Open-Closed Principle (OCP)<\/strong><\/li>\n\n\n\n<li><a href=\"https:\/\/csharptutorial.net\/csharp-design-patterns\/csharp-liskov-substitution-principle\/\">Liskov Substitution Principle (LSP)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/csharptutorial.net\/csharp-design-patterns\/csharp-interface-segregation-principle\/\">Interface Segregation Principle (ISP)&nbsp;<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/csharptutorial.net\/csharp-design-patterns\/csharp-dependency-inversion-principle\/\">Dependency Inversion Principle (DIP)<\/a><\/li>\n<\/ul>\n\n\n\n<p>The Open-closed principle states that software entities (<a href=\"https:\/\/csharptutorial.net\/csharp-tutorial\/csharp-class\/\">classes<\/a>, methods, functions, etc.) should be open for extension but closed for modification.<\/p>\n\n\n\n<p>In simple terms, you should design a class or a method in such a way that you can extend its behavior without directly modifying the existing source code.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">C# Open-closed principle example<\/h2>\n\n\n\n<p>The following program illustrates a violation of the open-closed principle:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Invoice<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> InvoiceNo {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> DateOnly IssuedDate {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Customer { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">decimal<\/span> Amount {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Description { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;}\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">InvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveFile<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a file.\"<\/span>);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveDB<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a database.\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ create a new invoice<\/span>\n        <span class=\"hljs-keyword\">var<\/span> invoice = <span class=\"hljs-keyword\">new<\/span> Invoice\n        {\n            InvoiceNo = <span class=\"hljs-number\">1<\/span>,\n            Customer = <span class=\"hljs-string\">\"John Doe\"<\/span>,\n            IssuedDate = <span class=\"hljs-keyword\">new<\/span> DateOnly(<span class=\"hljs-number\">2023<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">1<\/span>),\n            Description = <span class=\"hljs-string\">\"Website Design\"<\/span>,\n            Amount = <span class=\"hljs-number\">1000<\/span>\n        };\n\n        <span class=\"hljs-comment\">\/\/ save the invoice to a storage<\/span>\n        <span class=\"hljs-keyword\">var<\/span> invoiceRepository = <span class=\"hljs-keyword\">new<\/span> InvoiceRepository();\n        invoiceRepository.SaveFile(invoice);\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>How it works.<\/p>\n\n\n\n<p>First, define an <code>Invoice<\/code> class that has properties <code>InvoiceNo<\/code>, <code>IssuedDate<\/code>, <code>Customer<\/code>, <code>Amount<\/code>, and <code>Description<\/code>:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Invoice<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> InvoiceNo {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> DateOnly IssuedDate {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Customer { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">decimal<\/span> Amount {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Description { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;}\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define an <code>InvoiceRepository<\/code> class with two methods <code>SaveFile()<\/code> and <code>SaveDb()<\/code>. These methods save an invoice to a file and a database, respectively:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">InvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveFile<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a file.\"<\/span>);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveDB<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a database.\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"note\">These methods output a message to the console instead of saving an invoice to a file and a database.<\/p>\n\n\n\n<p>Third, create a new invoice and call the <code>SaveFile()<\/code> and <code>SaveDB()<\/code> methods to save the invoice into a file and database in the <code>Main()<\/code> method of the <code>Program<\/code> class:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ create a new invoice<\/span>\n        <span class=\"hljs-keyword\">var<\/span> invoice = <span class=\"hljs-keyword\">new<\/span> Invoice\n        {\n            InvoiceNo = <span class=\"hljs-number\">1<\/span>,\n            Customer = <span class=\"hljs-string\">\"John Doe\"<\/span>,\n            IssuedDate = <span class=\"hljs-keyword\">new<\/span> DateOnly(<span class=\"hljs-number\">2023<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">1<\/span>),\n            Description = <span class=\"hljs-string\">\"Website Design\"<\/span>,\n            Amount = <span class=\"hljs-number\">1000<\/span>\n        };\n\n        <span class=\"hljs-comment\">\/\/ save the invoice to a storage<\/span>\n        <span class=\"hljs-keyword\">var<\/span> invoiceRepository = <span class=\"hljs-keyword\">new<\/span> InvoiceRepository();\n        invoiceRepository.SaveFile(invoice);\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Suppose you need to save an invoice to a <code>JSON<\/code> file, then you need to modify the <code><code>InvoiceRepository<\/code><\/code> class by adding one more method to the <code><code>InvoiceRepository<\/code><\/code> class like this:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">InvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveFile<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a file.\"<\/span>);\n    }\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveDB<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a database.\"<\/span>);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">SaveJSON<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a JSON file.\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This violates the open-closed principle because adding a new function requires modifying the existing class. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Refactoring the program to follow the open-closed principle<\/h2>\n\n\n\n<p>To make the program conform to the Open-closed principle, you need to redesign the <code>InvoiceRepository<\/code> class so that when you want to save an invoice to a different storage, you don&#8217;t need to modify it.<\/p>\n\n\n\n<p>First, define an <code>IInvoiceRepository<\/code> interface that has a <code>Save()<\/code> method that saves an invoice to storage:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>;\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Second, define three classes that implement the <code>IInvoiceRepository<\/code> interface. These classes are responsible for saving an invoice in various storages including Text Files, Databases, and JSON files:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileInvoiceRepository<\/span> : <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a file.\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DBInvoiceRepository<\/span> : <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into the database.\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JSONInvoiceRepository<\/span>: <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into the database.\"<\/span>);\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Later, if you want to save an invoice in a different storage, you can create a new class that implements the <code>IInvoiceRepository<\/code> without modifying existing classes and interfaces.<\/p>\n\n\n\n<p>Third, create an invoice and save it to a text file, a JSON file, and a database by calling the <code>Save()<\/code> methods:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-8\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ create a new invoice<\/span>\n        <span class=\"hljs-keyword\">var<\/span> invoice = <span class=\"hljs-keyword\">new<\/span> Invoice\n        {\n            InvoiceNo = <span class=\"hljs-number\">1<\/span>,\n            Customer = <span class=\"hljs-string\">\"John Doe\"<\/span>,\n            IssuedDate = <span class=\"hljs-keyword\">new<\/span> DateOnly(<span class=\"hljs-number\">2023<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">1<\/span>),\n            Description = <span class=\"hljs-string\">\"Website Design\"<\/span>,\n            Amount = <span class=\"hljs-number\">1000<\/span>\n        };\n\n        <span class=\"hljs-comment\">\/\/ save the invoice a file<\/span>\n        IInvoiceRepository repo = <span class=\"hljs-keyword\">new<\/span> FileInvoiceRepository();\n        repo.Save(invoice);\n\n        <span class=\"hljs-comment\">\/\/ save the invoice to the DB<\/span>\n        repo = <span class=\"hljs-keyword\">new<\/span> DBInvoiceRepository();\n        repo.Save(invoice);\n\n        <span class=\"hljs-comment\">\/\/ save the invoice to the JSON file<\/span>\n        repo = <span class=\"hljs-keyword\">new<\/span> JSONInvoiceRepository();\n        repo.Save(invoice);\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-8\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Put it all together.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-9\" data-shcb-language-name=\"C#\" data-shcb-language-slug=\"cs\"><span><code class=\"hljs language-cs\">\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Invoice<\/span>\n{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> InvoiceNo {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> DateOnly IssuedDate {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Customer { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">decimal<\/span> Amount {  <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>; }\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">string<\/span>? Description { <span class=\"hljs-keyword\">get<\/span>; <span class=\"hljs-keyword\">set<\/span>;}\n}\n\n\n<span class=\"hljs-keyword\">interface<\/span> <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>;\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">FileInvoiceRepository<\/span> : <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into a file.\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DBInvoiceRepository<\/span> : <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into the database.\"<\/span>);\n    }\n}\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">JSONInvoiceRepository<\/span>: <span class=\"hljs-title\">IInvoiceRepository<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Save<\/span>(<span class=\"hljs-params\">Invoice invoice<\/span>)<\/span>\n    {\n        Console.WriteLine(<span class=\"hljs-string\">$\"Saved the invoice #<span class=\"hljs-subst\">{invoice.InvoiceNo}<\/span> into the database.\"<\/span>);\n    }\n}\n\n\n<span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Program<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">Main<\/span>(<span class=\"hljs-params\"><span class=\"hljs-keyword\">string<\/span>&#91;] args<\/span>)<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ create a new invoice<\/span>\n        <span class=\"hljs-keyword\">var<\/span> invoice = <span class=\"hljs-keyword\">new<\/span> Invoice\n        {\n            InvoiceNo = <span class=\"hljs-number\">1<\/span>,\n            Customer = <span class=\"hljs-string\">\"John Doe\"<\/span>,\n            IssuedDate = <span class=\"hljs-keyword\">new<\/span> DateOnly(<span class=\"hljs-number\">2023<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">1<\/span>),\n            Description = <span class=\"hljs-string\">\"Website Design\"<\/span>,\n            Amount = <span class=\"hljs-number\">1000<\/span>\n        };\n\n        <span class=\"hljs-comment\">\/\/ save the invoice a file<\/span>\n        IInvoiceRepository repo = <span class=\"hljs-keyword\">new<\/span> FileInvoiceRepository();\n        repo.Save(invoice);\n\n        <span class=\"hljs-comment\">\/\/ save the invoice to the DB<\/span>\n        repo = <span class=\"hljs-keyword\">new<\/span> DBInvoiceRepository();\n        repo.Save(invoice);\n\n        <span class=\"hljs-comment\">\/\/ save the invoice to the JSON file<\/span>\n        repo = <span class=\"hljs-keyword\">new<\/span> JSONInvoiceRepository();\n        repo.Save(invoice);\n\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-9\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">C#<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">cs<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h2 class=\"wp-block-heading\">Benefits of the Open-Closed Principle<\/h2>\n\n\n\n<p>The Open-closed principle brings the following benefits:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Code reusability: When you design a class to be open for extension, it becomes easier to reuse that code in other parts of the system. By creating reusable code, you can save time and effort in the long run. Also, it becomes easier to add new functionality to the system without impacting existing code<\/li>\n\n\n\n<li>Reduced code complexity: By creating classes that are closed for modification, you can reduce the complexity of the codebase. Hence, you can make it easier to maintain and extend the system when you want to add new features or make changes.<\/li>\n\n\n\n<li>Greater flexibility: The Open-closed principle promotes flexibility in the software system that allows you to easily and confidently add new functionality to the system without modifying existing code. This makes it easier to respond fast to changing requirements.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The Open-closed principle states that classes, methods, etc., should be open for extension but closed for modification.<\/li>\n\n\n\n<li>Leverage the open-closed principle to design more modular, flexible, and maintainable software.<\/li>\n<\/ul>\n<div class=\"helpful-block-content\" data-title=\"\">\n\t<header>\n\t\t<div class=\"wth-question\">Was this tutorial helpful ?<\/div>\n\t\t<div class=\"wth-thumbs\">\n\t\t\t<button\n\t\t\t\tdata-post=\"1453\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-open-closed-principle\/\"\n\t\t\t\tdata-post-title=\"C# Open-closed Principle\"\n\t\t\t\tdata-response=\"1\"\n\t\t\t\tclass=\"wth-btn-rounded wth-yes-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t\tclass=\"feather feather-thumbs-up block w-full h-full\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M14 9V5a3 3 0 0 0-3-3l-4 9v11h11.28a2 2 0 0 0 2-1.7l1.38-9a2 2 0 0 0-2-2.3zM7 22H4a2 2 0 0 1-2-2v-7a2 2 0 0 1 2-2h3\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> Yes <\/span>\n\t\t\t<\/button>\n\n\t\t\t<button\n\t\t\t\tdata-response=\"0\"\n\t\t\t\tdata-post=\"1453\"\n\t\t\t\tdata-post-url=\"https:\/\/www.csharptutorial.net\/csharp-design-patterns\/csharp-open-closed-principle\/\"\n\t\t\t\tdata-post-title=\"C# Open-closed Principle\"\n\t\t\t\tclass=\"wth-btn-rounded wth-no-btn\"\n\t\t\t>\n\t\t\t\t<svg\n\t\t\t\t\txmlns=\"http:\/\/www.w3.org\/2000\/svg\"\n\t\t\t\t\tviewBox=\"0 0 24 24\"\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke=\"currentColor\"\n\t\t\t\t\tstroke-width=\"2\"\n\t\t\t\t\tstroke-linecap=\"round\"\n\t\t\t\t\tstroke-linejoin=\"round\"\n\t\t\t\t>\n\t\t\t\t\t<path\n\t\t\t\t\t\td=\"M10 15v4a3 3 0 0 0 3 3l4-9V2H5.72a2 2 0 0 0-2 1.7l-1.38 9a2 2 0 0 0 2 2.3zm7-13h2.67A2.31 2.31 0 0 1 22 4v7a2.31 2.31 0 0 1-2.33 2H17\"\n\t\t\t\t\t><\/path>\n\t\t\t\t<\/svg>\n\t\t\t\t<span class=\"sr-only\"> No <\/span>\n\t\t\t<\/button>\n\t\t<\/div>\n\t<\/header>\n\n\t<div class=\"wth-form hidden\">\n\t\t<div class=\"wth-form-wrapper\">\n\t\t\t<div class=\"wth-title\"><\/div>\n\t\t\t\n\t\t\t<textarea class=\"wth-message\"><\/textarea>\n\n\t\t\t<button class=\"btn btn-primary wth-btn-submit\">Send<\/button>\n\t\t\t<button class=\"btn wth-btn-cancel\">Cancel<\/button>\n\t\t\n\t\t<\/div>\n\t<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In this tutorial, you&#8217;ll learn how to use C# open-closed principle to write code that is open for extension and closed for modification.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1441,"menu_order":1,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1453","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1453","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/comments?post=1453"}],"version-history":[{"count":4,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1453\/revisions"}],"predecessor-version":[{"id":2706,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1453\/revisions\/2706"}],"up":[{"embeddable":true,"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/pages\/1441"}],"wp:attachment":[{"href":"https:\/\/www.csharptutorial.net\/wp-json\/wp\/v2\/media?parent=1453"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}