C#复习⑤

2016年6月19日

22:39

Main Inheritance 继承

1.继承的语法结构

class A { // base class

int a;

public A() {...}

public void F() {...}

}

class B : A { // subclass (inherits from A, extends A)

int b;

public B() {...}

public void G() {...}

}

C#中类的继承只能是单继承,在Java中也只支持单继承,C++中支持多继承。但是C#、Java、C++均可以实现多个接口。

Single inheritance: a class can only inherit from one base class, but it can implement multiple interfaces.

某个类只能继承一个父类不能继承自结构体。

A class can only inherit from a class, not from a struct.

结构体不能被继承,但是可以实现多个接口。

Structs cannot inherit from another type, but they can implement multiple interfaces.

C#中所有的类的基类为Object类

A class without explicit base class inherits from Object.

2.Assignments and Type Checks分配和类型检查

class A {...}

class B : A {...}

class C: B {...}

  3.Overriding Methods重写方法

  只有在父类中声明为Virtual的方法才可以在子类中重写

  Only methods that are declared as virtual can be overridden in subclasses

  

  方法签名必须相同;

  Method signatures must be identical

  same number and types of parameters (including function type!)

  same visibility (public, protected, ...).

  属性和索引器同样可以被重写(对应关键字virtual 和 override);

  Properties and indexers can also be overridden (virtual, override).

  静态方法不可以被重写。

  Static methods cannot be overridden.

4.Dynamic Binding 动态绑定

动态绑定的好处:可以使用下面的方法针对不同类构造出的实例对象均有效。

class A {

public virtual void WhoAreYou() { Console.WriteLine("I am an A"); }

}

class B : A {

public override void WhoAreYou() { Console.WriteLine("I am a B"); }

}

调用举例:

A a = new B();

a.WhoAreYou();                // "I am a B"

动态绑定举例:

void Use (A x) {

x.WhoAreYou();

}

Use(new A());        // "I am an A"

Use(new B());        // "I am a B"

5.Hiding覆盖

在子类中成员函数可以被new关键字修饰;

使用new关键字修饰可以将那些和父类有相同函数名和签名的成员函数隐藏;

举例说明:

class A {

public int x;

public void F() {...}

public virtual void G() {...}

}

class B : A {

public new int x;

public new void F() {...}

public new void G() {...}

}

B b = new B();

b.x = ...;                // accesses B.x调用 b的x

b.F(); ... b.G();        // calls B.F and B.G调用的F函数和G函数

((A)b).x = ...;        // accesses A.x 调用A的x

((A)b).F(); ... ((A)b).G();         // calls A.F and A.G(although the dynamic type of (A)b is B)

//调用A的F函数和G函数,尽管(A)b的类型是B

6.Dynamic Binding (with Hiding)动态绑定(带覆盖即new关键字)

举例说明:

第一个简单的例子:

稍复杂点的例子:

7.子类中的构造函数

8.Visibility protected and internal可见性保护和internal

Protected:

在当前类中可见以及子类中可见

Visible in the declaring class and its subclasses(more restrictive than in Java)

Internal:

在当前Assembly可见

Visible in the declaring assembly (see later)

protected internal:

在当前类中、子类中、当前Assembly中可见

Visible in declaring class, its subclasses and the declaring assembly

9.抽象类和抽象方法

abstract class Stream {

public abstract void Write(char ch);

public void WriteString(string s) { foreach (char ch in s) Write(ch); }

}

class File : Stream {

public override void Write(char ch) {... write ch to disk ...}

}

注释:

抽象方法不能有实现;

Abstract methods do not have an implementation.

抽象方法隐藏着virtual关键字;

Abstract methods are implicitly virtual.

如果一个类中有抽象方法那么这个类也要声明为抽象类;

If a class has abstract methods (declared or inherited) it must be abstract itself.

抽象类不能实例化对象

One cannot create objects of an abstract class..

10.Abstract Properties and Indexers抽象属性和抽象索引器

abstract class Sequence {

public abstract void Add(object x);         // method

public abstract string Name { get; }         // property

public abstract object this [int i] { get; set; } // indexer

}

class List : Sequence {

public override void Add(object x) {...}

public override string Name { get {...} }

public override object this [int i] { get {...} set {...} }

}

重写的索引器和属性必须有和基类相同的get和set方法

Overriding indexers and properties must have the same get and set methods as in the base class

11.Sealed Classes 密封类

sealed class Account : Asset {

long balance;

public void Deposit (long x) { ... }

public void Withdraw (long x) { ... }

...

}

注释:

密封类不能扩展即继承(在Java中对应关键字final),但是可以继承自其他类;

sealed classes cannot be extended (same as final classes in Java),
but they can inherit from other classes.

重写方法可以被声明为单独的密封

override methods can be declared as sealed individually

12.Class System.Object Object类

class Object {

protected object        MemberwiseClone() {...}

public Type         GetType() {...}

public virtual bool         Equals (object o) {...}

public virtual string        ToString() {...}

public virtual int         GetHashCode() {...}

}

//Directly usable:

Type t = x.GetType();//returns a type descriptor (for reflection)

object copy = x.MemberwiseClone();//浅拷贝does a shallow copy (this method is protected)

//Overridable in subclasses:

x.Equals(y) //should compare the values of x and y

x.ToString() //should return a string representation of x

int code = x.GetHashCode(); //should return a hash code for x

Example

13.重载==和!=运算符

时间: 2024-12-14 19:43:10

C#复习⑤的相关文章

C++基础复习

一. C++与C的比较: C语言是一个结构化语言,它的重点在于算法和数据结构,C语言的设计首先要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到的输出(或实现过程(事物)控制). C++,首要考虑的是如何构造一个对象模型,让这个模型能够契合与之对应的问题域,这样就可以通过获取对象的状态信息得到输出或实现过程(事物)控制. 所以C语言和C++的最大区别在于它们解决问题的思想不同,一个面向过程一个面向对象. C++对C的"增强",表现在六个方面: 1.类型检测更为严格. 2.

大量逻辑判断优化的思路——责任链模式复习总结及其和状态模式对比

俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的总结知识点如下: 责任链模式概念和例子 使用的条件 和状态模式的比较分析 责任链的优缺点 纯的责任链和不纯的责任链 javax.servlet.Filter#doFilter()方法源码分析 基于AOP思想,模拟一个拦截器 前面说了一个状态模式,总结过程中发现和这个责任链的使用场景很类似,都是为了解耦大量复杂业务逻辑判断的,那么他们有什么不同呢?回忆状态模式——状态模式允许通过改变对象的内部状态而改变对象自身的行为,这个对象

算法分析与设计复习

算法分析与设计复习 2016年初,研一上学期期末考试前,复习并总结算法分析与设计科目的内容.复习过程参照<算法导论>中文第2版,同时参照PPT,章节划分根据PPT内容 概要: 第一章 概述 第二章 插入排序&分治策略 第三章 复杂度分析 第四章 堆与堆排序 第五章 快速排序 第六章 线性时间排序 第一章 概述 算法的应用范围 算法在诸如生物等诸多领域有其应用 算法的意义 算法在很多情况下让不可能完成的事情变成了可能,让处理的很慢的过程变快. 一个铺垫 一串不全为0的数,怎么取能拿到一段

复习PHP-语言参考-预定义接口

1.Traversable 他是一个遍历接口规范 注意:发现一个有用的函数get_declared_classes,可以以数组形式显示当前脚本下所有已经定义的类名 2.Iterator Iterator迭代器继承自Traversable,是一种遍历对象内容的对象. 你可以自己写一个子类继承自它,并写上具体遍历的方法. Iterator包含:current(返回当前元素),key(当前键),next(下一个元素),rewind(返回至初始元素),valid(检测当前元素是否存在)五种方法. 3.I

underscore 复习 对象函数 篇章

_.partial = function(func) { var boundArgs = slice.call(arguments, 1); var bound = function() { var position = 0, length = boundArgs.length; var args = Array(length); for (var i = 0; i < length; i++) { args[i] = boundArgs[i] === _ ? arguments[positio

数据结构复习之C语言指针与结构体

数据结构指针复习: #include <stdio.h> void main() { int a[5] = {8, 2, 3, 4, 5}; // a[3] == *(3+a) printf("%d\n", *(3+a)); // a[3] 4 printf("*a其实就是a[0]: %d\n", *a); // 8 // 地址是连续的 printf("%p\n", a+1); printf("%p\n", a+2

jsp servlet基础复习 Part1

jsp和servlet的一些基础知识整理,用于备忘. 一.jsp与servlet的基本关系 1.jsp-->web容器-->servlet-->加载进容器的虚拟机执行-->输出执行结果给浏览器端 在这个过程,所有位于<%%>之外的值,都被认为是out.println()中的内容进行直接输出.详细理解看代码 <html> <% //例子说明:servlet和jsp的关系 boolean b = false; if(b){ %> 这里是内容一 <

shell脚本复习

最近公司工作量很小,就复习复习,看起了马哥的视频,感觉马哥讲课讲得特别细.这才是深入到系统的讲解,补充了很多我之前只是了解到皮毛的东西. shell编程:弱类型编程语言 强:变量在使用前,必须事先声明,甚至还需要初始化 NULL: 弱:变量用时声明,甚至不区分类型: 变量赋值:VAR_NAME=VALUE 编译器,解释器 编程语言:机器语言.汇编语言.高级语言 静态语言:编译型语言 强类型(变量) 关键字: 事先转换成可执行格式 C.  C++.JAVA.C# 动态语言:解释型语言 on the

[Java面试一]面试复习大纲.

一.Java基础部分 (搞定所有技术之后才考虑复习的技术点) 1.数组中的排序问题(笔试或者机试,前者可能性更大) 2.面向对象的理解 3.集合相关的问题,比如hashmap跟hashtable的区别.搞清楚每个集合对象的特性就欧了. 4.多线程启动方式,以及产生死锁的原因和解决办法[多线程问题不是很常问,有精力就复习这块内容] 5.IO流,了解常见的几个流对象以及基本的流操作即可,被机试的可能性比较小. 二.Web基础 (1年工作经验者需要重点复习的技术点) 1.http协议(定义.常见的请求

c#复习-2

输入三个学生的信息学号.姓名.分数从大到小排序 1 using System; 2 using System.Collections; 3 using System.Collections.Generic; 4 using System.Linq; 5 using System.Text; 6 7 namespace 复习CS 8 { 9 class Program 10 { 11 struct Student 12 { 13 public int num; 14 public string C