您的位置:首页 > 编程语言 > C#

C#面向对象系列(1):值得关注的概念

2006-04-23 02:21 344 查看
静态变量:

不需要建立实体便可以调用的量,声明时修饰符里面需要有static才代表静态变量(如果使用const声明则表示常量,常量不可以改变,调用时也不需要建立实体,用const声明不可以再加static一起声明)

public class a

{

public static int i = 123;//静态变量

public int i2=123;//非静态

public const int Num=0;//常量,不可以改变的量

public static const int Num=0;//错误,声明常量时不能使用static,因为const事实上已经是static的了

public static void Main()//Main方法必须要为静态

{

a A = new a();//一个a类型的变量A,在声明时也对其用new关键字进行了初始化(建立了内存实体)

Console.WriteLine(A.i);//错误,因为A是已经建立实体的a类,而i是静态的,无法在实体中被调用

Console.WriteLine(A.i2);//OK,i2是非静态的

Console.WriteLine(a.i);//OK,直接调用a类的i,这个地方并没有建立它的实体

Console.WriteLine(a.Num);//OK,调用常量跟调用静态变量一样

a.Num=a.i;//错误,Num是常量,无法被更改

}

}

注意,常量只可以为实值类型(Value Type:int,long,byte,double,Single....)

重载与override

重载与override是两个完全不同的概念,override是子类对父类而言的,重载则是一个类自己对自己而言的

A类继承自B类,如果说B类中有些成员、方法、属性等声明为virtual,那就代表A类可以使用override关键字来“覆盖”基础类中的内容。

但是重载,是指一个类中可以多个索引、有同名的方法等,以不同的参数来区别之

public class B

{

public int Int = 0;

public virtual int Inte{get{return 123;}}//这是一个virtual的属性,这意味着继承自这个类的类可以修改这个属性

public void Do(int i)//声明了一个整数类型的参数

{

Console.WriteLine("1");//第一个do,输出 1

}

public void Do(long l)//因为参数类型不同于上面那个方法,虽然名字相同,但是仍然允许编译,因为在将来调用这个名字的方法的时候,编译器会自动根据调用这个方法时所传送的参数来选择适合的方法,这就是重载

{

Console.WriteLine("2");//第二个do,输出 2

}

}

public class A : B

{

public override int Inte{get{return 321;}}//这个地方override了B类的Inte属性,如果Inte不是virtual,则不允许override

public override int Int = 1;//错误,不可以这样,因为Int不是virtual的

new public int Int = 1;//这样才可以,使用new关键字来隐藏基础类中的内容,这个你可以暂时不了解,看了就是了

this.Do(123);//这个类因为继承自B类,所以它拥有B的一部分成员,包括这那两个Do方法,这里调用Do时传送的是一个int的量,所以调用的是第一个Do,会输出 1

this.Do((long)123);//这个地方传送的是一个long类型的量,所以会执行第二个Do,输出 2

}

虚拟方法和接口

抽象方法只能够存在于抽象类中,

抽象方法只能够有声明的部分,而不能够有实现部分,例如:public abstract void a();//以";"代替"{...}"

抽象方法是默认为virtual的,所以你在声明一个抽象方法时不能够再使用virtual关键字

抽象类如果得不到继承,几乎没有什么意义,而在你继承了一个抽象类以后,对于里面的每一个抽象成员你都必须override之,至于为什么要这样,很容易理解,抽象方法仅仅有一个声明的部分,没有任何实现的代码,不override,它又有什么意义呢?

抽象类中不止可以有抽象的方法,还可以有其他类型的方法(就是非抽象的方法,非抽象的方法可以包含内容的代码)

抽象类可以继承自其他的类,同样,也可以继承自另一个抽象类

有一个共同点:抽象类和接口都不能够被建立内存实体,都必须先得到继承,然后再建立继承的那个类的实体(像Image,你就无法直接建立它的实体,因为它是一个抽象类)

l 接口里面所有的内容都只能有声明的部分,不能够有实现的代码,这一点跟抽象类中的抽象方法很像,

l 接口里声明的所有成员都必须是public的,但是事实上,接口中的每个成员也都是默认为public的,所以你在声明它的时候不能再加一个public

l 接口能够继承自其他的接口

l 你在使用接口的时候,对接口中定义的每一个方法都必须完整地实现之,而且在实现它们的时候,你不需要使用override关键字

abstract class B//声明了一个抽象类

{

public int I = 0;//这里声明了一个普通的变量

public abstract void Do();//这里声明了一个抽象方法,注意这里是如何声明的

public abstract void Do(int i);

public void Do2()//这里声明了一个普通的方法

{

Console.WriteLine("Do2");

}

}

class A:B//因为A继承自B,所以对于B中的所有public成员,A都有

{

public override void Do() //对于每一个abstract的方法都必须override

{

Console.WriteLine("new Do1");

}

public override void Do(int i)//对于每一个abstract的方法都必须override

{

Console.WriteLine("new Do2 "+i.ToString());

}

}

public class C

{

public static void Main()//Main必须为静态方法

{

A a = new A();

a.Do();//输出"new Do1"

a.Do(123);//输出"new Do2 123"

a.Do2();//输出"Do2"

}

}

public interface I1

{

void Say();//记住,这个地方不能够使用其他的修饰符

public void Says();//错误,使用了public修饰符,因为Interface中的成员都是默认为public的

}

public class AA:I1

{

public void Say()//因为I1这个接口定义了一个void的Say方法,所以在这里必须予以实现

{

Console.WriteLine("Say AA!");

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: