1、定义类的时候不指定父类,则父类是Object类。Object类是任何类的直接或者间接父类。所有类都是Object的子类。
2、例1:
class person
{public string name{get;set;}public int age{get;set;}
}
public class Chinese:Person
{public string HuKou{get;set;}public void KongFu(){....}
}
Chinese p1 = new Chinese();
p1.Name="李雷";
p1.HuKou="北京市朝阳区";
p1.SayHello();
p1.KongFu();
class Chinese:person //继承,:后为父类名
{string
}
class Japanese:person
{
}
在别的类中调用:
Chinese c=new Chinese(); //拥有person类Chinese类中的所有public要素。Japanese j=new Japanese(); //拥有person类Japanese类中的所有public要素。
父类的变量可以指向子类的变量。如:
Person p=c; //c从变量看是一个Chinese,所以可以把一个person标签贴到c上。
子类的变量不能直接指向父类的变量,必须要进行显示转换。如:
Chinese c2=p; //错误。p从变量看是一个person,所以不可以把一个Chinese标签直接贴到c上。
Chinese c2=(chinese)p; //正确。如果转换失败,则抛出异常。
Chinese c3=p as chinese; //跟上一行的效果相同,也是显式转换。如果失败,结果是null,不报错。
if(p1 is japanese) //is是运算结果为bool的运算符,表示p1指向的对象是否是指定的类型。
{Console.writeLine(“日本人”);
}
else if(p1 is chinese)
{Console.writeLine(“中国人”);
}
3、有new的地方就有对象。方法名可以是中文。类与类之间主要有两种关系:继承、组合。一个类对象可以作为另一个类的成员。类的属性、字段可以是另外一个对象。一个类调用另外一个类实现的动作就叫组合。
4、当new一个子类时,先执行父类,再执行子类。如下面的例子,当B b=new B;时,先执行①,再执行②,即输出:
构造A
构造B
如果A还有父类,则先执行A的父类,再执行A,再执行B,以此类推。
先调用父类的构造函数。
子类可以调用父类中的public成员,但不能调用private成员。如下面的例子中,③不可以调用,④可以。
Protected 保护类,类似于遗产保护类。自己可以调用。子类也可以调用,子类的子类等间接子类也可以调用。其他类不能调用。
class A
{public A(int i){}public A(){Console.writeLine(“构造A”); //①}private void m1(){}publice void m2(){}protected void m3(){}
}
class B:A
{public B() //默认已经有“:base”,调用父类中的无参构造函数,也可以写成public B():base。只是“:base”可忽略不写而已。{Console.writeLine(“构造B”); //②this.m1(); //③,错误,不可调用。Private成员只有自己能调用,儿子也不能调。this.m2(); //④,正确,可调用base.m3(); //调用父类的m3。跟“this.m3();”是一样的。C#中Base就是父类、基类的意思,在别的语言中叫super,即超类。}
}
class program()
{static void Main(string[] args){B b=new B();A a=new A();}
}
5、类的继承与组合:
class LiGang
{public 打人(){Console.WriteLine(“拳打脚踢”);Console.WriteLine(“飞毛腿”);Console.WriteLine(“十八掌”);}Public 掀摊子(){}
}
继承方式实现复用。只有父类的大部分行为、状态都需要的时候才继承。
class LRJ:LiGang
{
}
组合方式实现复用。组合方式没有继承的包袱,用的更多。
class TuFei
{public LiGang LG{get; set;}public void 打人(){LG.打人();}
}
调用部分的代码:
TuFei t=new TuFei();
t.LG=new LiGang();
t.打人();