首页 > 编程语言 >C# 封装(详细)

C# 封装(详细)

时间:2024-03-19 16:59:39浏览次数:28  
标签:Console 访问 C# class width 详细 封装 public Rectangle

把一个或多个项目封闭在一个物理的或者逻辑的包中。

在面向对象程序设计方法论中,封装是为了防止对实现细节的访问

抽象和封装是面向对象程序设计的相关特性。抽象允许相关信息可视化,封装则使开发者实现所需级别的抽象


封装根据具体的需要,设置使用者的访问权限,并通过 访问修饰符 来实现。

一个 访问修饰符 定义了一个类成员的范围和可见性。C# 支持的访问修饰符如下所示:

  • public:所有对象都可以访问;
  • private:对象本身在对象内部可以访问;
  • protected:只有该类对象及其子类对象可以访问
  • internal:同一个程序集的对象可以访问;
  • protected internal:访问限于当前程序集或派生自包含类的类型。

  • 比如说:一个人A为父类,他的儿子B,妻子C,私生子D(注:D不在他家里)

    如果我们给A的事情增加修饰符:

    •  public事件,地球人都知道,全公开
    •  protected事件,A,B,D知道(A和他的所有儿子知道,妻子C不知道)
    •  private事件,只有A知道(隐私?心事?)
    •  internal事件,A,B,C知道(A家里人都知道,私生子D不知道)
    •  protected internal事件,A,B,C,D都知道,其它人不知道

Public 访问修饰符

Public 访问修饰符允许一个类将其成员变量和成员函数暴露给其他的函数和对象。任何公有成员可以被外部的类访问。

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        //成员变量
        public double length;
        public double width;

        public double GetArea()
        {
            return length * width;
        }
        public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }// Rectangle 结束

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 4.5;
            r.width = 3.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

在上面的实例中,成员变量 length 和 width 被声明为 public,所以它们可以被函数 Main() 使用 Rectangle 类的实例 r 访问。

成员函数 Display() 和 GetArea() 可以直接访问这些变量。

成员函数 Display() 也被声明为 public,所以它也能被 Main() 使用 Rectangle 类的实例 r 访问。

Private 访问修饰符

Private 访问修饰符允许一个类将其成员变量和成员函数对其他的函数和对象进行隐藏。只有同一个类中的函数可以访问它的私有成员。即使是类的实例也不能访问它的私有成员。

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        // 私有成员变量
        private double length;
        private double width;

        // 公有方法,用于从用户输入获取矩形的长度和宽度
        public void AcceptDetails()
        {
            Console.WriteLine("请输入长度:");
            length = Convert.ToDouble(Console.ReadLine());
            Console.WriteLine("请输入宽度:");
            width = Convert.ToDouble(Console.ReadLine());
        }

        // 公有方法,用于计算矩形的面积
        public double GetArea()
        {
            return length * width;
        }

        // 公有方法,用于显示矩形的属性和面积
        public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }//end class Rectangle    

    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            // 创建 Rectangle 类的实例
            Rectangle r = new Rectangle();

            // 通过公有方法 AcceptDetails() 从用户输入获取矩形的长度和宽度
            r.AcceptDetails();

            // 通过公有方法 Display() 显示矩形的属性和面积
            r.Display();

            Console.ReadLine();
        }
    }
}
  • length 和 width 被声明为私有成员变量,以防止直接在类的外部访问和修改。

  • AcceptDetails 方法允许用户输入矩形的长度和宽度,这是通过公有方法来操作私有变量的一个例子。

  • GetArea 方法用于计算矩形的面积,而 Display 方法用于显示矩形的属性和面积。

  • 在 ExecuteRectangle 类中,通过创建 Rectangle 类的实例,然后调用其公有方法,来执行操作。这样,主程序无法直接访问和修改矩形的长度和宽度,而是通过类提供的公有接口来进行操作,实现了封装。

 

 

Protected 访问修饰符

Protected 访问修饰符允许子类访问它的基类的成员变量和成员函数。这样有助于实现继承。

继承是面向对象程序设计中最重要的概念之一。继承允许我们根据一个类来定义另一个类,这使得创建和维护应用程序变得更容易。同时也有利于重用代码和节省开发时间。

当创建一个类时,程序员不需要完全重新编写新的数据成员和成员函数,只需要设计一个新的类,继承了已有的类的成员即可。

这个已有的类被称为的基类,这个新的类被称为派生类

基类和派生类

一个类可以派生自多个类或接口,这意味着它可以从多个基类或接口继承数据和函数。
 

<访问修饰符> class <基类>
{
 ...
}
class <派生类> : <基类>
{
 ...
}
using System;
namespace InheritanceApplication
{
   class Shape 
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 派生类
   class Rectangle: Shape
   {
      public int getArea()
      { 
         return (width * height); 
      }
   }
   
   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();

         Rect.setWidth(5);
         Rect.setHeight(7);

         // 打印对象的面积
         Console.WriteLine("总面积: {0}",  Rect.getArea());
         Console.ReadKey();
      }
   }
}
基类的初始化

派生类继承了基类的成员变量和成员方法。因此父类对象应在子类对象创建之前被创建。您可以在成员初始化列表中进行父类的初始化。

using System;
namespace RectangleApplication
{
   class Rectangle
   {
      // 成员变量
      protected double length;
      protected double width;
      public Rectangle(double l, double w)
      {
         length = l;
         width = w;
      }
      public double GetArea()
      {
         return length * width;
      }
      public void Display()
      {
         Console.WriteLine("长度: {0}", length);
         Console.WriteLine("宽度: {0}", width);
         Console.WriteLine("面积: {0}", GetArea());
      }
   }//end class Rectangle  
   class Tabletop : Rectangle
   {
      private double cost;
      public Tabletop(double l, double w) : base(l, w)
      { }
      public double GetCost()
      {
         double cost;
         cost = GetArea() * 70;
         return cost;
      }
      public void Display()
      {
         base.Display();
         Console.WriteLine("成本: {0}", GetCost());
      }
   }
   class ExecuteRectangle
   {
      static void Main(string[] args)
      {
         Tabletop t = new Tabletop(4.5, 7.5);
         t.Display();
         Console.ReadLine();
      }
   }
}

多重继承

多重继承指的是一个类别可以同时从多于一个父类继承行为与特征的功能。

与单一继承相对,单一继承指一个类别只可以继承自一个父类。

C# 不支持多重继承。但是,您可以使用接口来实现多重继承。

using System;
namespace InheritanceApplication
{
   class Shape 
   {
      public void setWidth(int w)
      {
         width = w;
      }
      public void setHeight(int h)
      {
         height = h;
      }
      protected int width;
      protected int height;
   }

   // 基类 PaintCost
   public interface PaintCost 
   {
      int getCost(int area);

   }
   // 派生类
   class Rectangle : Shape, PaintCost
   {
      public int getArea()
      {
         return (width * height);
      }
      public int getCost(int area)
      {
         return area * 70;
      }
   }
   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle Rect = new Rectangle();
         int area;
         Rect.setWidth(5);
         Rect.setHeight(7);
         area = Rect.getArea();
         // 打印对象的面积
         Console.WriteLine("总面积: {0}",  Rect.getArea());
         Console.WriteLine("油漆总成本: ${0}" , Rect.getCost(area));
         Console.ReadKey();
      }
   }
}

 

Internal 访问修饰符

Internal 访问修饰符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有 internal 访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。

using System;

namespace RectangleApplication
{
    class Rectangle
    {
        //成员变量
        internal double length;
        internal double width;
        
        double GetArea()
        {
            return length * width;
        }
       public void Display()
        {
            Console.WriteLine("长度: {0}", length);
            Console.WriteLine("宽度: {0}", width);
            Console.WriteLine("面积: {0}", GetArea());
        }
    }//end class Rectangle    
    class ExecuteRectangle
    {
        static void Main(string[] args)
        {
            Rectangle r = new Rectangle();
            r.length = 4.5;
            r.width = 3.5;
            r.Display();
            Console.ReadLine();
        }
    }
}

成员函数 GetArea() 声明的时候不带有任何访问修饰符。如果没有指定访问修饰符,则使用类成员的默认访问修饰符,即为 private。 

 

Protected Internal 访问修饰符

Protected Internal 访问修饰符允许在本类,派生类或者包含该类的程序集中访问。这也被用于实现继承。

标签:Console,访问,C#,class,width,详细,封装,public,Rectangle
From: https://blog.csdn.net/Seike_113/article/details/136499178

相关文章

  • 150. 逆波兰表达式求值c
    intf(inta,intb,charc){if(c=='+')returna+b;if(c=='-')returna-b;if(c=='/')returna/b;returna*b;}intevalRPN(char**tokens,inttokensSize){int*stack=(int*)malloc(sizeof(int)*tokensSize);......
  • mysql 主从配置(docker安装)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c4524269de0049249b27d88015f0cd2b.png想要获取pdf文件可以关注:点击百度文库->mysql主从......
  • 猿人学19题关于ja3的curl_cffi库最终程序
    网上很多大佬对19题指纹技术进行了详细的描述。https://zhuanlan.zhihu.com/p/601474166唯独缺源码fromcurl_cffiimportrequestssession=requests.Session(impersonate="chrome120")session.headers.update({'User-Agent':'yuanrenxue.project'})session.cookie......
  • 459. 重复的子字符串c
    voidbuild(int*next,char*s,intn){next[0]=-1;intindex=1,j=-1;while(index<n){if(j==-1||s[index-1]==s[j]){j++;next[index++]=j;}else{j=next[j];}}for(inti=0;......
  • C++ kmalloc、kzalloc、vmalloc的区别
    1.kmalloc函数原型:void*kmalloc(size_tsize,gfp_tflags);kmalloc()申请的内存位于物理内存映射区域,而且在物理上也是连续的,它们与真实的物理地址只有一个固定的偏移,因为存在较简单的转换关系,所以对申请的内存大小有限制,不能超过128KB。较常用的flags(分配内存的方法):G......
  • Python贷款违约预测:Logistic、Xgboost、Lightgbm、贝叶斯调参/GridSearchCV调参
    原文链接:https://tecdat.cn/?p=35392原文出处:拓端数据部落公众号分析师:LinsengBo银行贷款业务是银行的主要盈利方式,对于具体的贷款申请人,是否可以同意贷款申请是一件十分重要的步骤,如果贷款人在贷款后出现违约行为,这将对银行的资金流稳定性造成不利的影响。因此针对贷款人的“......
  • 前端基础之CSS基础
    一、什么是cssCSS(CascadingStyleSheets的缩写),翻译为“层叠样式表”或者“级联样式表”,简称样式表。主要用来给HTML网页设置外观或者样式(HTML网页中的文字大小、颜色、字体、网页的背景颜色、背景图片等)。通俗来说就是给HTML标签添加样式的,让它变得更加好看二、注释语法......
  • 前端基础之CSS选择器
    一、什么是选择器选择器是指通过一定的语法规则选取到对应的HTML标记,然后给这个对应的HTML标记设置样式二、选择器的分类CSS中提供了多种不同类型的选择器,例如基本选择器、组合选择器、伪类选择器、伪元素选择器等等。1、基本选择器(1)概览在CSS中,选择器用于选取HTML文档中的......
  • 【博客】CDQ分治
    CDQ分治前言CDQ分治是一种分治CDQ分治是一种特殊的分治思想可以用于跟点对有关的问题还有其他用处......(目前不会)算法流程一般来说,cdq分治是通过如下结构进行分治一共分为三步:找到当前区间\([l,r]\)中点\(mid\)递归处理左右区间\([l,mid]\),\([mid+1,r]\)计算左区间......
  • 如何用数字示波器测量PCB上电源的纹波
    如何用数字示波器测量PCB上电源的纹波1.简介PCB上电源的纹波是指电源输出中的交流成分,通常由开关电源、稳压电路或滤波电容引起。了解和测量电源纹波可以帮助我们评估电源稳定性和可靠性,并确保电路正常运行。本文将介绍如何使用数字示波器来准确测量和分析PCB上的电源纹......