与类相关基本概念----Beginning Visual C#

span.kw { color: #007020; font-weight: bold; }
code > span.dt { color: #902000; }
code > span.dv { color: #40a070; }
code > span.bn { color: #40a070; }
code > span.fl { color: #40a070; }
code > span.ch { color: #4070a0; }
code > span.st { color: #4070a0; }
code > span.co { color: #60a0b0; font-style: italic; }
code > span.ot { color: #007020; }
code > span.al { color: #ff0000; font-weight: bold; }
code > span.fu { color: #06287e; }
code > span.er { color: #ff0000; font-weight: bold; }

-->

更多相关文章,见本人的个人主页:zhongxiewei.com

类定义

定义类的修饰符:

  • internal (default访问修饰符),当前项目中的代码对其有访问权限
  • public(访问修饰符),公开其可访问性
  • abstract,说明该类是抽象类,不能实例化,只能被继承,可以拥有抽象成员
  • sealed,不能被继承

关于类的修饰符需要注意的是:

  • 没有private和protected修饰符
  • public类不能够继承自internal类,如 public class MyClass : MyBase {} // MyBase is a internal class,不过internal可以继承自public类
  • 继承抽象类时,除非当前类也是抽象的,就必须对所有抽象成员初始化
  • 继承时,不允许多重继承
  • 类定义中,父类和接口同时存在是,父类必须位于冒号后面的第一个位置,如:public class MyClass : MyBase, IMyInterface {}

接口定义

定义接口的修饰符:

  • internal (default访问修饰符),当前项目中的代码对其有访问权限
  • public(访问修饰符),公开其可访问性

需要注意的是:

  • 没有sealed,abstract修饰符
  • 允许接口的多重继承
  • 当接口被类继承时,接口中的所有函数都必须实现

System.Object

当类没有继承对象时,默认继承System.Object,那么就有必要看看该类中到底有什么。

Method Description
Object() 构造函数
~Object() 析构函数
virtual bool Equals(object) this和other对象进行比较
static bool Equals(object,object) 比较输入的两个对象,内部调用上一个函数,true all null
static bool ReferenceEquals(object,object) 比较输入的两个对象是不是同一个对象的引用
virtual string ToString() 默认返回类类型的名字
object MemberwiseClone() 构建新的object实例,并对成员变量进行copy,引用类型的成员变量仍然引用同一个变量
System.Type GetType() 返回对象的类型
virtual int GetHashCode() 返回对象的hash值

使用GetType的一个示例:

if (myObj.GetType() == typeof(MyComplexClass))
{
    // myObj is an instance of the class MyComplexClass
}

类成员定义

修饰关键字:

  • public,任何代码都能够访问
  • private,类内部的代码才能够访问
  • internal,项目内部的代码才能够访问
  • protected,继承的子类中的代码能够访问
  • static,属于类的成员,而不单属于某个对象

只针对成员变量的修饰符:

  • readonly,只读变量,在声明或构造函数中进行初始化

只针对成员函数的修饰符:

  • virtual,能够被重载的函数
  • abstract, 必须被重载的函数,只能在abstract类中存在
  • override,重载基类中的函数
  • extern,函数的定义在其他的地方
  • sealed,函数无法被进一步重载

属性定义

private int myInt;

public int MyIntProp
{
    get
    {
        return myInt;
    }
    set
    {
        if (value >= 0 && value <= 10)
            myInt = value;
        else
            throw(...);
    }
}

隐藏基类中的函数

很容易想到的实现方式如下:

public class MyBaseClass
{
    public void DoSomething()
    { // base implementation
    }
}

public class MyDerivedClass : MyBaseClass
{
    public void DoSomething()
    { // Derived class implementation, hides base implementation
    }
}

但是上面的代码在编译的过程中会出现警告,说MyDerivedClass中的DoSomething函数隐藏了基类中的DoSomething函数,请使用new关键字,即public new void DoSomething() {}

Collection

可以使用现有的System.Collections.ArrayList实现。这里要讲的是自己定义Collections。可以采用如下的方式来实现,如:

public class Animals : CollectionBase
{
    // Add功能
    public void Add(Animal newAnimal)
    {
        List.Add(newAnimal);
    }

    // Remove功能
    public void Remove(Animal oldAnimal)
    {
        List.Remove(oldAnimal);
    }

    // 实现MyAnimal[0]的访问方式
    public Animal this[int animalIndex]
    {
        get
        {
            return (Animal)List[animalIndex];
        }
        set
        {
            List[animalIndex] = value;
        }
    }

    public Animals()
    {
    }
}

操作符重载

重载操作符的成员函数是公有静态的。需要注意的是在进行变量转换的成员函数的定义过程中,有两个额外的关键字explicitimplicit

// 二元操作符+
public class Class1
{
    public int val;
    // 二元操作符
    public static Class1 operator +(Class1 op1, Class1 op2)
    {
        Class1 returnVal = new Class1();
        returnVal.val = op1.val + op2.val;
        return returnVal;
    }

    // 一元操作符,-
    public static Class1 operator -(Class1 op1)
    {
        Class1 returnVal = new Class1();
        returnVal.val = -op1.val;
        return returnVal;
    }
}

is操作符和as操作符

is操作符:检测一个未知的变量能够转化成为已知的类型的变量。如果可以则返回true,否则返回false。但是它并不能判断两个类型是否相同。

它的语法结构为:<operand> is <type>

该表达式的可能的结果如下:

  • 如果type是class类型,那么当<operand>也是那个类型,或是那个类的子类,或是可以转换成那个类型时,返回的结果为true
  • 如果type是interface类型,那么当operand是那个类型,或是那个类型的实现的时候,返回结果为true
  • 如果type是value type,如int,那么当operand是那个类型,或是可以隐式转换成那个类型的时候,返回结果为true

as操作符,将变量转换成特殊的引用类型。<operand> as <type>

适用于以下环境,

  • 如果operand的类型与type相同。
  • 如果operand能够隐式转换成type类型
  • 如果operand能够无损的强制得转换成type类型。

如果不能够转换,则返回的结果为null。

BaseClass obj1 = new BaseClass();
DerivedClass obj2 = obj1 as DerivedClass; // return null 不会抛出异常,如果使用 ... = (DerivedClass)obj1; 则会抛出异常

// 如果以下面的方式进行转换则是可以的
DerivedClass derivedClass = new DerivedClass();
BaseClass baseClass = derivedClass;
DerivedClass newDerivedClass = baseClass as DerivedClass; // not null

深度拷贝

直接采用System.Object对象内的MemberwiseClone()当遇到类含有引用变量的时候,就不能够实现深层的拷贝,如:

public class Content
{
    public int Val;
}

public class Cloner
{
    public Content MyContent = new Content();
    public Cloner(int newVal)
    {
        MyContent.Val = newVal;
    }

    public object GetCopy()
    {
        return MemberwiseClone();
    }
}

// 具体调用
Cloner mySource = new Cloner(5);
Cloner myTarget = (Cloner)mySource.GetCopy();
mySource.MyContent.Val = 2; // 这将导致myTarget.MyTarget.Val也相应的改变成了2

要实现深度的拷贝,可以实现ICloneable接口。

public class Cloner : ICloneable
{
    public Content MyContent = new Content();
    public Cloner(int newVal)
    {
        MyContent.Val = newVal;
    }
    public object Clone()
    {
        Cloner clonedCloner = new Cloner(MyContent.Val);
        return clonedCloner;
        // 或是
        // Cloner clonedCloner = new Cloner();
        // clonedCloner.MyContent = MyContent.Clone();
        // return clonedCloner;
    }
}

自定义异常

自定义的过程中,只要继承Expection类并进行实现即可。如:

public class AgeBelowZeroException : Exception
{
    public AgeBelowZeroException() :
        base("The age must >= 0")
    {
    }
}
时间: 2024-10-05 21:11:25

与类相关基本概念----Beginning Visual C#的相关文章

基本概念----Beginning Visual C#

更多相关文章,见本人的个人主页:zhongxiewei.com 变量 注释方式:// 注释在这里和/* 注释在这里 */ 整形变量的类型: Type Alias for Allowed Values sbyte System.SByte Integer between -2^7 and 2^7-1 byte System.Byte Integer between 0 and 2^8-1 short System.Int16 Integer between -2^15 and 2^15-1 ush

关于对象的行为、数组、继承和类的高级概念

1.对象的行为:                   (1)方法调用栈:所有的方法调用都维护在一个称为调用栈的结构中. 第一个被调用的方法就是main(),该方法是Jvm调用的,因此main()方法总是在调用栈的底部. (2)调用方法:一个方法被调用时该方法就放在调用栈的顶部,知道方法执行完成. 三种情况:①方法返回一个值:一个基本数据类型或一个引用数据类型被传回给方法的调用者: ②方法不返回一个值:返回值被声明为void:  ③方法抛出一个异常给方法的调用者. Java中的方法只能出现在类中,

linux设备驱动归纳总结(一)内核的相关基础概念【转】

本文转载自:http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 一.linux设备驱动的作用 内核:用于管理软硬件资源,并提供运行环境.如分配4G虚拟空间等. linux设备驱动:是连接硬件和内核之间的桥梁. linu

理解嵌入式开发中的一些硬件相关的概念

做嵌入式系统开发,经常要接触硬件.做嵌入式开发对数字电路和模拟电路要有一定的了解.这样才能深入的研究下去.下面我们简单的介绍嵌入式开发中的一些硬件相关的概念. 电平(Level) 在数字电路中,分为高电平和低电平,分别用1和0表示.一个数字电路的管脚,总是存在一个电平的,要么高要么低,或者说要么1要到0(其实,还有另一种状态,后面会提到). 总线(Bus) 在嵌入式系统中一定会有一块处理器芯片,此外,还有其它的芯片作为外部设备(后面简称外设),这些芯片与处理器协作实现产品的功能.复杂的产品往往是

JAVA——类的高级概念

类的每一个成员(包括变量.方法和构造器)都有一个访问修饰符,用于判断谁可以访问成员.Java为类的成员提供了四种访问级别,按照访问权限由大到小排列如下: ■公开访问级别:使用public关键字修饰.用public关键字修饰的成员对外公开,即公开成员可以被任何其他对象访问. ■受保护访问级别:使用protected关键字修饰.受保护的成员可以被同一包中的类所访问,还可以被类的子类所访问,不管子类是在那个包中. ■默认访问级别:没有访问修饰符.默认访问级别的成员可以被同一包中的其它类所访问. ■私有

java学习笔记(七)类的高级概念

类的高级概念包括:访问修饰符.封装.静态成员.初始化块以及内部类等混合内容. 访问修饰符: (1).公开访问级别:使用public关键字修饰.用public关键字修饰的成员对外公开,即公开成员可以被任何其它对象访问. (2).受保护访问级别:使用protected关键字修饰.受保护的成员可以被同一包中的类所访问,还可以被类的子类所访问,不管子类是在哪个包中. (3).默认访问级别:没有访问修饰符.默认访问级别的成员可以被同一包中的其它类所访问. (4).私有访问级别:使用private关键字修饰

Class类相关

Class类是java.lang包中的类,该类的实例可以帮助程序创建其他类的实例或者取得其他类的对象的内部信息 使用class类获得一个类相关的class类(注意得到的是class类,不是相关的类) 比如类名 classFuck类 有类方法(静态方法)public static Class forName(String classFuck)throw ClassNotFoundException 然后我们用Class对象调用以下方法(classFuck必须有一个无参构造函数 public Obj

Python 之路 Day06 类基础和概念

本章大纲: 类的对象和类的区别 类的名称空间 __dict__ 类的对象的名称空间 __dict__ 绑定方法和非绑定方法 类和类型 变量变形(封装变量,控制变量引用)__ 类的绑定方法 id命令分析内存地址(类的名称空间属性和类对象名称空间属性内存指向) is命令(比较内存地址指向) property类对象的属性方法 staticmethod类对象的非绑定方法 __str__自定义str(self)  类对象字符串格式打印 类的继承 __bases__显示类的继承 类的继承查找顺序 类的继承查

第8章 类的高级概念

1.局部变量不能加访问修饰符,成员变量可以. 2.static 的类属性,不属于对象所有,所有对象共享该属性.尽量使用类名调用类属性,而不是对象名. 3.类本身也有访问修饰符,但是类的访问修饰符只有共有的和默认(无访问修饰符)的两种.默认访问的类只能被同一包中的其他类使用. 4.封装也被称为数据隐藏. 5.类的成员变量可以成为只读或者只写的. 6.类的静态成员被称为类成员,因为静态成员与类相关,而不是类的某个实例. 7.静态成员变量和方法不能使用引用来访问,因为引用是指类的实例. 8.静态方法是