C#学习速记_定义类

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() 方法

转载于:https://my.oschina.net/moyung2014/blog/1810646

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值