9.C# 类
1.类定义格式
【访问修饰符】class 类名 【:父类名,接口名,接口名】
{
//类成员
}
类的访问修饰符有public、internal两个,没有标明访问修饰符默认为internal,被internal修饰的类只能在当前项目中访问,即只能在同一个程序集中访问;public 修饰的类可以被其他项目中的代码访问。类成员默认的访问修饰符是private。除了可访问修饰符之外,还可以使用abstract 标明类是抽象的,用sealed标明类是密封的,不能继承的,如
public abstract A
{
//类成员
}
C#使用:表示继承,每个类只能继承一个父类,且必须放在冒号后面;可以继承多个接口,接口放在父类后面,多个接口用逗号隔开。如果类定义时没有指定继承的父类,那么当前类默认继承System.Object类。继承时派生类的可访问行不能高于父类,否则编译不通过,如下定义是错误的
internal class A
{ } public class B:A
{ }
2.接口的定义
【访问修饰符】interface 接口名【:接口1,接口2】
{ }
注:不能使用abstract修饰接口,接口成员本身就是抽象的,也不能使用sealed,因为接口必须继承并且实习其类成员。接口不是类,所以没有继承System.Object类。接口不能直接实例化
接口成员不能用访问修饰符修饰,默认是public,但是不能用public修饰。接口不能包含字段,但是可以包含属性,如下面定义将提示接口不能包含字段
interface IHotDrink
{ bool Milk ; int Sugar; int AddSugar(int amount);
}
正确的定义是把字段定义成属性,如
interface IHotDrink
{
/// <summary>
/// 是否加牛奶
/// </summary>
bool Milk { get; set; } /// <summary>
/// 加糖的数量(块),如加了两块方糖
/// </summary>
int Sugar { get; set; } int AddSugar(int amount);
}
3.接口的实现
继承接口的类必须实现接口定义的属性和方法,且不能降低接口成员的访问性,即必须用public修饰
interface IHotDrink
{
/// <summary>
/// 是否加牛奶
/// </summary>
bool Milk { get; set; } /// <summary>
/// 加糖的数量(块),如加了两块方糖
/// </summary>
int Sugar { get; set; } int AddSugar(int amount);
} class CupofCoffee : IHotDrink
{
private bool _Milk;
public bool Milk//实现接口属性
{
get { return _Milk; }
set { _Milk = value; }
}
private int _Sugar;
public int Sugar
{
get { return _Sugar; }
set { _Sugar = value; }
} private string _BeanType;
/// <summary>
/// 咖啡品牌
/// </summary>
string BeanType
{
get { return _BeanType; }
set { BeanType = value; }
} public int AddSugar(int amount)//实现接口方法
{
Sugar += amount;
return Sugar;
}
}
4.System.Object类
因为C#中所有的类都直接或者间接继承System.Object类,所以所有类都可以访问Object类中的受保护的和公共的成员。Object类常用的成员有:
1)public Object()
System.Object类的构造函数,派生类的构造函数会自动调用这个方法。
2)~Object()
System.Object类的析构函数,也称为Finalize()(终结函数),派生类的析构函数自动调用,不能手动调用。析构函数只能由垃圾回收器调用
3)public virtual bool Equals(Object o)
把调用该方法的对象和另一个对象比较,如果他们是同一个实例,即指向同一个地址空间则返回true,如果只是想比较两个对象的值是否相等可以重写这个方法
A a = new A();
A b = new A();
A c = a;
Console.WriteLine(a.Equals(b));//false
Console.WriteLine(a.Equals(c));//true
4)public static bool Equals(object objA, object objB)
比较两个对象是否同一个引用,比较时调用了Equals(object)方法,所以如果重写了Equals(object)方法,那么这个方法比较的结果也会随之改变。如果obA 和objB都为null返回true
class A
{ //重写Equals方法,比较两个对象是否是同一个类的实例
public override bool Equals(object obj)
{
return (this.GetType()==obj.GetType());
}
} static void Main(string[] args)
{
A a = new A();
A b = new A();
A c = a;
Console.WriteLine(a.Equals(b));//true
Console.WriteLine(a.Equals(c));//true
Console.WriteLine(A.Equals(a,b));//true
Console.ReadLine();
}
5)public static bool ReferenceEquals(object objA, object objB)
比较两个对象是否是同一引用,如果是或者两个都是null返回true
6)public virtual string ToString();
返回当前对象的类名,可以重写它返回自己想要的内容
class A
{ public string ToStringOld()
{
return base.ToString();
} public override string ToString()
{
return "这类A";
}
} static void Main(string[] args)
{
A a = new A(); Console.WriteLine(a.ToString());//重写后返回这类A
Console.WriteLine(a.ToStringOld());//没重写时返回命名空间.类名: ConsoleApplication1.A Console.ReadLine();
}
6)public Type GetType()
以System.Type对象的形式返回对象的类型
7)public virtual int GetHashCode()
用作对象的散列函数,这是一个必选函数,返回一个以压缩形式标识的对象状态的值,即对象的哈希代码
假设两个对象的比較结果相等,则每一个对象的 GetHashCode 方法都必须返回同一个值。可是,假设两个对象的比較结果不相等,则这两个对象的 GetHashCode 方法不一定返回不同的值。
一个对象的 GetHashCode 方法必须总是返回同一个哈希代码,但前提是没有改动过对象状态,对象状态用来确定对象的 Equals 方法的返回值。请注意,这仅适用于应用程序的当前执行,再次执行该应用程序时可能会返回还有一个哈希代码。
GetHashCode方法的作用参考https://blog.csdn.net/cnhk1225/article/details/23391885
8)protected object MemberwiseClone()
通过创建一个新对象实例并复制成员,以复制该对象。成员的拷贝不会得到这些成员的新实例,新对象的引用类型的成员都将引用和原对象同样的对象。因为这个方法是受保护的,所以只能在派生类中使用
class A
{ } class B : A
{
public C c = new C();
public int age; public B Clone()
{
return (B)this.MemberwiseClone();
} } class C
{
public int grade;
} class Program
{
private static object lokk = new object(); static void Main(string[] args)
{ B a = new B();
B b = a.Clone();
Console.WriteLine(b.Equals(a));//false 说明不是同一个实例
Console.WriteLine(b.c.Equals(a.c));//true 说明是c对象同一个实例,指向同一个地址
Console.WriteLine(a.c.grade);//
b.c.grade = ;
Console.WriteLine(a.c.grade);//2说明a.c和b.c指向同一个地址空间 Console.ReadLine();
} }
9.C# 类的更多相关文章
- Java类的继承与多态特性-入门笔记
相信对于继承和多态的概念性我就不在怎么解释啦!不管你是.Net还是Java面向对象编程都是比不缺少一堂课~~Net如此Java亦也有同样的思想成分包含其中. 继承,多态,封装是Java面向对象的3大特 ...
- C++ 可配置的类工厂
项目中常用到工厂模式,工厂模式可以把创建对象的具体细节封装到Create函数中,减少重复代码,增强可读和可维护性.传统的工厂实现如下: class Widget { public: virtual i ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
- ASP.NET MVC with Entity Framework and CSS一书翻译系列文章之第二章:利用模型类创建视图、控制器和数据库
在这一章中,我们将直接进入项目,并且为产品和分类添加一些基本的模型类.我们将在Entity Framework的代码优先模式下,利用这些模型类创建一个数据库.我们还将学习如何在代码中创建数据库上下文类 ...
- ASP.NET Core 折腾笔记二:自己写个完整的Cache缓存类来支持.NET Core
背景: 1:.NET Core 已经没System.Web,也木有了HttpRuntime.Cache,因此,该空间下Cache也木有了. 2:.NET Core 有新的Memory Cache提供, ...
- .NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类
.NET Core中间件的注册和管道的构建(2)---- 用UseMiddleware扩展方法注册中间件类 0x00 为什么要引入扩展方法 有的中间件功能比较简单,有的则比较复杂,并且依赖其它组件.除 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- PHP-解析验证码类--学习笔记
1.开始 在 网上看到使用PHP写的ValidateCode生成验证码码类,感觉不错,特拿来分析学习一下. 2.类图 3.验证码类部分代码 3.1 定义变量 //随机因子 private $char ...
- C# 多种方式发送邮件(附帮助类)
因项目业务需要,需要做一个发送邮件功能,查了下资料,整了整,汇总如下,亲测可用- QQ邮箱发送邮件 #region 发送邮箱 try { MailMessage mail = new MailMess ...
- .NET平台开源项目速览(18)C#平台JSON实体类生成器JSON C# Class Generator
去年,我在一篇文章用原始方法解析复杂字符串,json一定要用JsonMapper么?中介绍了简单的JSON解析的问题,那种方法在当时的环境是非常方便的,因为不需要生成实体类,结构很容易解析.但随着业务 ...
随机推荐
- Echarts Map 值域为小数的原因
最近做一个项目用到了Echarts Map不知道怎么回事,有时多了一位小时,可这个意义不用小数表示(1.0个人似乎觉得有点奇怪嘞 {boolean}calculable false 是否启用值域漫游, ...
- hdu6363 bookshelf 容斥+数列+数论gcd定理(也可以Möbius)
#define _CRT_SECURE_NO_WARNINGS #include<cmath> #include<iostream> #include<stdio.h&g ...
- C和C指针小记(十)-函数
1.函数的定义 函数的定义就是函数体的实现. 语法: 类型 函数名(形式参数) 代码块 函数返回类型和函数名分开写是代码风格的问题,现代语言如swift返回值在函数名和参数表的后面,这样使得某些工程工 ...
- Hibernate的配置文件,hibernate.cfg.xml
单纯的只针对持久层框架 Hibernate 配置文件的一些总结 一.Hibernate底层原理 1. Hibernate保存原理 目的:把domain对象保存到数据库的表,形成一条记录. sql: i ...
- strlen函数的汇编实现分析
[原创][老刘谈算法001]这位运算玩的真溜—strlen函数的汇编实现分析-『密码算法』-看雪安全论坛 https://bbs.pediy.com/thread-229243.htm
- Linux上mount 挂载windows共享文件权限问题
在服务器部署的时候需要把文件夹设置在windows的共享文件上.在使用mount命令挂载到linux上后.文件路径和文件都是可以访问,但是不能写入,导致系统在上传文件的时候提示“权限不够,没有写权限” ...
- cocoapod引入FLEX,debug模式正常,Release报错library not found for -lXXX
cocoapod引入FLEX,debug模式正常,Release报错library not found for -lXXX, 因为podfile是这么写的: pod 'FLEX', '~> 2. ...
- SRTP讨论
1.接下来任务如何分工? 2.接下来要完成哪些工作? 硬件上要完成哪些? 1)环境数据的采集(我) 2)对小车的控制(我) 3)路径规划(喻) 4)小车的避障(雷) 5)环境数据的处理融合(我) 6) ...
- 查找->静态查找表->折半查找(有序表)
文字描述 以有序表表示静态查找表时,可用折半查找算法查找指定元素. 折半查找过程是以处于区间中间位置记录的关键字和给定值比较,若相等,则查找成功,若不等,则缩小范围,直至新的区间中间位置记录的关键字等 ...
- tornado框架&三层架构&MVC&MTV&模板语言&cookie&session
web框架的本质其实就是socket服务端再加上业务逻辑处理, 比如像是Tornado这样的框架. 有一些框架则只包含业务逻辑处理, 例如Django, bottle, flask这些框架, 它们的使 ...