c# 面相对象2-之封装性
一、封装特性:
这是一种隐藏的特性。可以用一个公式来展示类的封装特性:
封装的类=数据 + 对此数据进行的操作(即算法)
通俗的说,封装就是:包起外界不必要知道的东西,只向外界展露可供展示的东西。
在面向对象理论中,封装这个概念拥有更为宽广的含义。小到一个简单的数据结构,大到一个完成的软件子系统,静态的如某个软件系统要收集数据信息项,动态的如某个工作处理的流程,都可以封装到一个类中。
具备这种封装的意识,是掌握面向对象分析与设计技巧的关键
二、类的成员:
成员变量:在类里面定义的变量
成员属性:在类里面定义的属性
成员函数:在类里面定义的函数
成员属性:定义变量,右键重构,封装字段,set赋值,get取值
类成员声明主要包括:常量(const)、字段(变量)、方法、属性、事件、索引器、运算符、构造函数、析构函数等。
类的数据成员包含字段、常量和事件。
class Goods
{
public double height; //实例字段
public readonly double width = ; //只读字段在声明时赋值
public static int count = ; //静态字段,
public Goods( double h, double w )
{
height = h;
width = w; //只读字段在构造函数中赋值
count++;
}
static void Main( string[ ] args )
{
Goods y = new Goods(, );
Console.WriteLine("height ={0}, width={1},count= {2}", y. height, y.width, Goods.count );
Goods z = new Goods( , );
Console.WriteLine("height ={0}, width={1},count= {2}", z. height, z.width, Goods.count );
// z.width=700 ;则编译错误。只读字段不能在这里赋值
} }
【格式】:
方法修饰符 数据类型说明符 方法名([形式参数说明列表])
{
变量、数组的定义语句;
其他可执行部分
}
C#中类定义可以包含两种方法:静态和非静态。定义静态时用static修饰,定义一个静态方法时,不能用virtual、abstract或override修饰符。
使用时需注意如下两点:
1)静态方法属于类所有,非静态方法属于类定义的对象所有 ,又称实例方法。
2)非静态方法可以访问类中包括静态成员在内的所有成员,而静态方法只能访问类中的静态成员。
public void Eat()//成员函数(方法)
{
Console.Write("吃饭了!");
}
{
get { return weight; } //只读属性
set { weight = value; } //只写属性
}
using System; class Account
{
private double balance = ; //字段
public double Balance //属性
{
get { return balance; }
set { balance = value;}
}
/*=============================================================
* 我们可以通过修改get、set方法达到控制存取的目的。
* 例如:
*
* 1)只读属性
* public double Balance //属性
* {
* get { return balance; }
* set { }
* }
*
* 2)读写控制
* public double Balance
* {
* get
* {
* if(Console.ReadLine()=="1234")
* return balance;
* else
* return -9999999;
* }
* set { }
* }
* =============================================================
*/ public void Deposit(double n)
{ this.balance += n; } public void WithDraw(double n)
{ this.balance -= n; }
} class Client
{
public static void Main()
{
Account a = new Account();
a.Balance = ; // 可以读写属性,因为属性Balance是public型的
//a.balance = 1000; //不可以读写字段,因为字段balance是private型的 a.WithDraw();
a.Deposit();
Console.WriteLine(a.Balance);
}
}
定义类的构造函数有如下规则:
1)构造函数的函数名和类的名称一样。
2)当某个类没有构造函数时,系统将自动为其创建构造函数,这种构造函数称为默认构造函数。
example1()
{
};
3)构造函数的访问修饰符总是public。如果是private,则表示这个类不能被实例化,这通常用于只含有静态成员的类中。
4)构造函数由于不需要显示调用,因而不用声明返回类型。
5)构造函数可以带参数也可以不带参数。
特点:
a.写法特殊:没有返回类型,函数名必须和类名一样。
b.执行时机特殊:在类实例化的时候执行,是最先执行的函数,可以用来初始化数据。
eg1
class Employee
{
protected string ID,Name,Salary;
public Employee()
{
ID="";
Name="*****";
Salary="";
Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary);
}
public Employee(string id)
{
ID=id;
Name="空缺";
Salary="空缺";
Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary);
}
public Employee(string id,string name)
{
ID=id;
Name=name;
Salary="空缺";
Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary);
}
public Employee(string id,string name,string salary)
{
ID=id;
Name=name;
Salary=salary;
Console.WriteLine("{0}\t{1}\t{2}",ID,Name,Salary);
}
}
eg2
sing System; public class Person
{
public string name = "";
public int age = ; //默认构造函数
public Person()
{
} //构造函数重载(1)
public Person(int Age)
{
this.age = Age;
} //构造函数重载(2)
public Person(int Age, string Name)
{
this.age = Age;
this.name = Name;
} public void ShowInfo()
{
Console.WriteLine("The name is : " + name);
Console.WriteLine("The age is:" + age);
}
} class Client
{
public static void Main()
{
Person p1 = new Person();
p1.ShowInfo(); Console.WriteLine("=========================="); Person p2 = new Person();
p2.ShowInfo(); Console.WriteLine("==========================");
Person p3 = new Person(, "Tom");
p3.ShowInfo();
}
}
7、函数重载
条件:
a.函数名必须相同
b.函数需要的参数数量不同
c.函数需要的参数数量相同的情况下,类型不同
8、this关键字
partial class Ren
{
private int year;
private int month;
private int day; public Ren(int y,int m)
{
year = y;
month = m;
}
public Ren(int y,int m,int d):this(y,m)//this
{
day = d;
} public void Showbirthday()
{
Console.WriteLine(name+"的生日是"+year+"年"+month+"月"+day+"日");
}
private string name; public string Name
{
get { return name; }
set { name = value; }
} public void Eat()
{
Console.WriteLine(name+"正在吃饭~");
} }
8.static关键字
eg
using System;
class Example1
{
static public int a;//静态成员
public int b; //实例成员
void Meth1() //实例方法
{
a++; //实例方法中可以访问本类的静态成员
b++; //实例方法中可以访问本类的实例成员
}
static void Meth2()
{
a++; //静态方法能够访问本类的静态成员
//b++; //静态方法不能访问本类的实例成员
}
9.例题
//接8中的例子中的类
public static void Main()
{
Example1 E1 = new Example1();//产生类的实例E1
Example1 E2 = new Example1();//产生类的实例E2
E1.Meth1(); //调用非静态方法需使用类的实例
//E1.Meth2(); //此语句出现错误,因为静态方法只能由类来调用
Console.WriteLine("a={0},b={1}",Example1.a,E1.b);
//E2.a=50; //此语句出现错误,因为静态方法只能由类来调用
Example1.a = Example1.a + ;//静态成员只能通过类来访问
E2.b = Example1.a + ; //此语句正确,实例成员由对象来访问,静态成员由类来访问
Console.WriteLine("a={0},b={1}", Example1.a, E2.b);
}
}
c# 面相对象2-之封装性的更多相关文章
- 【C/C++】面相对象开发之封装
封装继承多态是面向对象程序开发的基础概念.是实现面向对象的基本要素. 封装 程序开发,最核心价值,是数据. 程序其实是读取数据,操作数据,保存数据等一系列操作. 那么经过良好组织过的数据,将使编程事半 ...
- JavaScript大杂烩3 - 理解JavaScript对象的封装性
JavaScript是面向对象的 JavaScript是一种基于对象的语言,你遇到的所有东西,包括字符串,数字,数组,函数等等,都是对象. 面向过程还是面向对象? JavaScript同时兼有的面向过 ...
- Java开发知识之Java面相对象
Java开发知识之Java面相对象上 一丶什么是面相对象 了解什么什么是面相对象.那么首先要了解什么是面相过程. 面相过程的意思就是. 什么事情都亲力亲为. 比如上一讲的排序算法. 我们自己写的. 这 ...
- Java连载37-面向对象的封装性
一.IDE上继续新建工程 1.在src目录下新建软件包:package机制后面再讲,目前先用着 2.给package命名一个名称:com.bjpowernode.java_learning 3.软件包 ...
- Java基础语法Day_06(面相对象和封装)
第1节 描述类介绍与使用 day06_01_面向对象思想的概述 day06_02_面向对象思想的举例 day06_03_类和对象的关系 day06_04_类的定义 day06_05_对象的创建及其使用 ...
- 文成小盆友python-num7 -常用模块补充 ,python 牛逼的面相对象
本篇内容: 常用模块的补充 python面相对象 一.常用模块补充 1.configparser模块 configparser 用于处理特定格式的文件,起内部是调用open()来实现的,他的使用场景是 ...
- 【PHP面向对象(OOP)编程入门教程】9.封装性(var与public,protected,private的关系)
封装性是面象对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义: 1. 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独 ...
- PHP中面相对象对象的知识点整理
面向对象 万物皆对象,将构成问题的事务分解到各个对象上,建立对象的目的不是为了完成一个工作,而是为了描述某个事务在解决问题中的行为,更符合人的思维习惯,代码重用性高,可扩展性. ___________ ...
- 体验Java的封装性
package com.cnblogs.java; //体验Java的封装性 /* * 如下的人类年龄赋值-300岁,显然很不合理,这种直接对类的属性赋值,有时候虽然不合理但却会编译通过. * 所以我 ...
- [改善Java代码]使用静态内部类提高封装性
建议38: 使用静态内部类提高封装性 Java中的嵌套类(Nested Class)分为两种:静态内部类(也叫静态嵌套类,Static Nested Class)和内部类(Inner Class).内 ...
随机推荐
- CLR via C# - Char_String
.NET中Char表示为16为的Unicode值,Char提供两个public const字段MinValue('\0',写成'\u0000'也是一样的)和MaxValue('\uffff'). Ch ...
- jQuery数组处理函数
写在前面: jQuery的数组处理函数整理如下,如有补充和建议,欢迎评论交流~ 1.$.trim(value) 从value中删除任何前导或尾随的空白字符 2.$.each(containe ...
- [Python][MachineLeaning]Python Scikit-learn学习笔记1-Datasets&Estimators
Scikit-learn官网:http://scikit-learn.org/stable/index.html Datasets 标准的数据集格式为一组多维特征向量组成的集合.数据集的标准形状(sh ...
- C++程序设计实践指导1.10二维数组元素换位改写要求实现
改写要求1:改写为以单链表和双向链表存储二维数组 改写要求2:添加函数SingleLinkProcess()实现互换单链表中最大结点和头结点位置,最小结点和尾结点位置 改写要求3:添加函数Double ...
- 用PS画一个齿轮
以前只会画圆画方,这没技术含量.今天学了一个稍难一点的,画一个齿轮.图形有圆也有方.以下描述如何画出来的. 一.打开PS准备一画布,画一矩形并且填充颜色. 二.编辑->自由变换(CTRL+T), ...
- POJ2485 最小生成树
问题:POJ2485 本题求解生成树最大边的最小值 分析: 首先证明生成树最大边的最小值即最小生成树的最大边. 假设:生成树最大边的最小值比最小生成树的最大边更小. 不妨设C为G的一个最小生成树,e是 ...
- ZendFramework2 源码分析 init_autoloader.php
// Composer autoloading if (file_exists('vendor/autoload.php')) { // 加载自动加载器 $loader = include 'vend ...
- GitLab CI
GitLab CI持续集成配置方案 目录 1. 持续集成介绍 1.1 概念 1.2 持续集成的好处 2. GitLab持续集成(CI) 2.1 简介 2.2 GitLab简单原理图 2.3 Git ...
- WebSocket C# Demo
WebSocket 规范 WebSocket 协议本质上是一个基于 TCP 的协议.为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTT ...
- EMMA: 免费java代码测试覆盖工具
From:http://emma.sourceforge.net/ EMMA: a free Java code coverage tool Code coverage for free: a b ...