C#中的类定义
定义
class MyClass
{
// Class members.
}
// 默认为 internal, 只能在项目中访问
(public, internal) class MyClass
{
// Class members.
}
// 抽象类,不能实例化,只能继承,可以有抽象成员
(public, internal) abstract class MyClass
{
// Class members, may be abstract.
}
// 密封类,只能实例化,不能被继承
(public, internal) sealed class MyClass
{
// Class members.
}
继承
// 默认所有类继承自 System.Object
// 只能有一个基类
// 如果继承的是抽象类,必须实现所有抽象成员(除非派生类也是抽象类)
// 派生类可访问性不能高于基类
public class MyClass : MyBase
{
// Class members.
}
// 支持该接口类的类必须实现所有接口成员,不想使用指定接口成员时,成员代码实现留空
// 先基类,后接口,逗号分隔
public class MyClass : IMyInterface
{
// Class members.
}
public class MyClass : MyBase, IMyInterface
{
// Class members.
}
public class MyClass : MyBase, IMyInterface, IMySecondInterface
{
// Class members.
}
类定义中可以使用的访问修饰符
修饰符 | 含义 |
---|---|
无 或 internal | 只能在当前项目中访问类 |
public | 可以在任何地方访问类 |
abstract 或 internal abstract | 类只能在当前项目中访问,不能实例化,只能被继承 |
public abstract | 类可以在任何地方访问,不能实例化,只能被继承 |
sealed 或 internal sealed | 类只能在当前项目中访问,不能被继承,只能实例化 |
public sealed | 类可以在任何地方访问,不能被继承,只能实例化 |
接口
- 可以用 public 与 internal,默认为 internal
- 不能使用 abstract 与 sealed
interface IMyInterface
{
// Interface members.
}
public interface IMyInterface : IMyBaseInterface, IMyBaseInterface2
{
// Interface members.
}
System.Object
所有类都继承自此类
if (myObj.GetType() == typeof(myComplexClass))
{
// myObj is an instance of the class myComplexClass.
}
构造函数和析构函数
// 默认
class MyClass
{
public MyClass()
{
// Constructor code.
}
~MyClass()
{
// Destructor code.
}
}
// 类无法实例化
class MyClass
{
private MyClass()
{
// Constructor code.
}
}
// 重载
class MyClass
{
public MyClass()
{
// Default Constructor code.
}
public MyClass(int myInt)
{
// Nondefault Constructor code.
}
}
构造函数执行顺序
- 先执行System.Object.Object()
- 执行基类构造函数
- 执行派生类构造函数
public class MyBaseClass
{
public MyBaseClass()
{
// 0
}
public MyBaseClass(int i)
{
// 1
}
}
public class MyClass : MyBaseClass
{
public MyClass()
{
// 3
}
public MyClass(int i)
{
// 4
}
public MyClass(int i, int j)
{
// 5
}
}
MyClass myObj = new MyClass(); // 执行顺序 0,3
MyClass myObj = new MyClass(4); // 执行顺序 0,4
MyClass myObj = new MyClass(4, 8); // 执行顺序 0,5
______________________________________________________________________
// 通过 base 改变执行基类构造函数
public class MyBaseClass
{
public MyBaseClass()
{
// 0
}
public MyBaseClass(int i)
{
// 1
}
}
public class MyClass : MyBaseClass
{
public MyClass()
{
// 3
}
public MyClass(int i)
{
// 4
}
public MyClass(int i, int j) : base(i)
{
// 5
}
}
MyClass myObj = new MyClass(4, 8); // 执行顺序 1,5
______________________________________________________________________
public class MyBaseClass
{
public MyBaseClass()
{
// 0
}
public MyBaseClass(int i)
{
// 1
}
}
public class MyClass : MyBaseClass
{
public MyClass() : base(5)
{
// 3
}
public MyClass(int i)
{
// 4
}
public MyClass(int i, int j)
{
// 5
}
}
MyClass myObj = new MyClass(); // 执行顺序 1,3
______________________________________________________________________
// 通过 this 改变执行当前构造函数
public class MyBaseClass
{
public MyBaseClass()
{
// 0
}
public MyBaseClass(int i)
{
// 1
}
}
public class MyClass : MyBaseClass
{
public MyClass() : this(5)
{
// 3
}
public MyClass(int i)
{
// 4
}
public MyClass(int i, int j)
{
// 5
}
}
MyClass myObj = new MyClass(); // 执行顺序 0,4, 3
______________________________________________________________________
public class MyBaseClass
{
public MyBaseClass()
{
// 0
}
public MyBaseClass(int i)
{
// 1
}
}
public class MyClass : MyBaseClass
{
public MyClass() : this(5, 6)
{
// 3
}
public MyClass(int i)
{
// 4
}
public MyClass(int i, int j) : base(i)
{
// 5
}
}
MyClass myObj = new MyClass(); // 执行顺序 1,5, 3
Visual Studio 中的 OOP 工具
类库项目
- 只包含类(没有项目入口点,只包含相关类型下定义)的项目
- 类库项目会编译成 .dll 文件
- 在其它项目中添加引用,即可使用
接口和抽象类
相同点
- 都包含有由派生类继承的成员
- 都不能直接实例化
- 都可以声明这些类型的变量,但不能直接访问派生对象的其他生员
不同点
- 派生类只能直接继承自一个抽象类,但可以通过继承链包含多个抽象类
- 类可以使用任意多个接口
- 抽象类可以拥有抽象成员(没有代码体,需要在派生类中实现,否则派生类也必须是抽象的)
- 抽象类可以拥有非抽象成员(有代码体,可以是虚拟的,可以在派生类中重写)
- 接口成员(没有代码体)必须都在使用接口的类上实现
- 接口成员是公有的 public
- 抽象成员可以是私有的 private、受保护的 protected、内部的 private 或受保护的内部的 protected private
- 接口不能包含字段、构造函数、析构函数、静态生员或常量
结构类型
结构是值类型,类是引用类型
浅度和深度复制
把每1个成员从一个对象复制到另一个对象可能不会成功,因为其中一些成员可能是引用类型
浅度复制
通过派生 System.Object 的 MemberwiseClone() 方法,来实现对象成员的复制。
深度复制
通过实现 ICloneable 接口的 Clone() 方法