一步一步学习C#(四 继承)

1.类的继承

 

     1)继承父类,即拥有该类的所有成员字段和方法     比如:继承一个控件,就等于继承了此控件的所有方法与属性,节省编码量。

 

        1.启动vs,建立一个简单的winform窗口,输入一个按钮,在按钮事件中写入代码:MessageBox.Show("you clicked me!");

 

        2、我们再建立一个Form窗口,我们选择“继承的窗体”,再次选择刚刚建立的Form1。

 

        3、这样在新建立的Form2窗口中也有一个按钮了(这个按钮就是继承了Form1窗口而来,而且删除不掉)。

 

        4、我们修改入口方法main(),修改代码如下:      将原来的Application.Run(new Form1());修改为为Application.Run(new Form2());

 

        5、运行效果一样,但是实际上运行的是一个继承的窗体。

 

 (1)接口类似于一个模板,它定义了一种签名方式,什么是签名?  int onemethod(int a){}  就是定义了一种签名方式,它的内容是空的。 如果一个具有int参数并且有int返回值的方法,我们就说满足此种签名方式。 (2)一个类继承了接口,则必须要有接口中定义的签名的方式的方法。 (3)接口中定义的方法不能有实际内容。 (4)接口就是通过继承来使用的。 (5)接口不能包括字段。

 

 (1)       结构派生于System.ValueType,它们不能实现继承,但是可以继承接口。 (2)       类可以继承类和接口。

 

 如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual 和 override,派生类方法就会隐藏基类方法。

 

 用base关键字表示基类 用this关键字表示本类     base.<MethodName>()  this. <MethodName>()

 

 (1)抽象类用abstract来定义  (2)抽象类与接口非常类似,抽象方法没有执行代码,  (3)抽象类不能实例化,只能继承  (4)抽象方法没有执行代码,必须在非抽象的派生类中重写  (5)类中成员只要有一个是抽象的,则类必须是抽象的。  (6)抽象方法用override重写,而接口则不用。

 

 (1)对于一些永远也不想让别人继承我们用sealed来修饰它。 (2)当然它的方法是不可重写的,也就是不可以定义为虚方法。 (3)不能将sealed作用于方法。

 

 (1)在子类中声明同样的方法 (2)在子类中声明同样的方法,并用new修饰 (3)在子类中声明同样的方法,用override来修饰,当然必须祖先要有virtual修饰。

 

 (1)声明接口在语法上与声明抽象类完全相同 (2)接口中只能包含方法、属性、索引器和事件的声明。 (3)不能实例化接口,接口不能有构造函数。 (4)接口成员总是公共的,不能声明为虚拟或静态。因为它是依附于类的。 (5)接口是可以继承的。例如:

 

  列子:

 

1 Public class a
2 {}
3 Public class b:a
4 {}

 

 

 

 

 

2.接口的继承

 

 1)接口类似于一个模板,它定义了一种签名方式,什么是签名?

 

      int onemethod(int a){}  就是定义了一种签名方式,它的内容是空的。
     如果一个具有int参数并且有int返回值的方法,我们就说满足此种签名方式。
2)一个类继承了接口,则必须要有接口中定义的签名的方式的方法。
3)接口中定义的方法不能有实际内容。
4)接口就是通过继承来使用的。
5)接口不能包括字段。
接口继承代码:
1 public interface tank_action
2 {
3 void fire();
4 void go();
5 }
6  class tank1:tank_action
7 {
8 public void fire()
9 {
10 Console.WriteLine("tank1 is now firing!");
11 }
12 public void go()
13 {
14 Console.WriteLine("tank1 is now going!");
15 }
16 }
17
18 调用:
19 tank1 aa = new tank1();
20 aa.fire();
21 aa.go();
22 Console.ReadLine();

注意:

 

 

 

1 一个类只能有唯一的一个父类,而不能同时继承多个
2 例如:
3 public class a
4 {
5 }
6 public class b
7 {
8 }
9 public class c : a,b
10 {
11 }
12  

 

 
    结构与类在继承上的区别:
(1结构派生于System.ValueType,它们不能实现继承,但是可以继承接口。
 
2类可以继承类和接口。
  
接口特性: 
1声明接口在语法上与声明抽象类完全相同
2接口中只能包含方法、属性、索引器和事件的声明。
3不能实例化接口,接口不能有构造函数。
4接口成员总是公共的,不能声明为虚拟或静态。因为它是依附于类的。
5)接口是可以继承的。
  
3.隐藏方法
    如果签名相同的方法在基类和派生类中都进行了声明,但该方法没有声明为virtual override,派生类方法就会隐藏基类方法。
1 隐藏方法例子:
2  class class1
3 {
4 public void class1_method1()
5 {
6 Console.WriteLine("aa");
7 }
8 }
9 class class2:class1
10 {
11 public void class1_method1()
12 {
13 Console.WriteLine("bb");
14 }
15 }
16 调用:
17 class2 testclass =
18  new class2();
19 testclass.class1_method1();
20 Console.ReadLine();

 

 

4.调用函数的基类

 

  用base关键字表示基类
  用this关键字表示本类   
  base.<MethodName>()
  this. <MethodName>()
代码
调用基类例子:
class CustomerAccount
{
public virtual decimal CalculatePrice()
{
return 1M;
}
}
class GoldAccount : CustomerAccount
{
public override decimal CalculatePrice()
{
return base.CalculatePrice() * 0.9M;
}
}
调用:
GoldAccount test
= new GoldAccount(); Console.WriteLine(test.CalculatePrice()); Console.ReadLine();

 

 
5.抽象类和抽象方法
 1)抽象类用abstract来定义
 2)抽象类与接口非常类似,抽象方法没有执行代码,
 3)抽象类不能实例化,只能继承
 4)抽象方法没有执行代码,必须在非抽象的派生类中重写
 5)类中成员只要有一个是抽象的,则类必须是抽象的。
 6)抽象方法用override重写,而接口则不用。
1 抽象类和抽象方法例子:
2 abstract class Building
3 {
4 public abstract decimal Calculate(); // abstract method
5   }
6 class newBuilding : Building
7 {
8 public override decimal Calculate ()
9 {
10 Console.WriteLine("aa");
11 return 2.2M;
12 }
13 }
14
15 调用:
16 newBuilding test = new newBuilding();
17 Console.WriteLine(test.Calculate ());
18 Console.ReadLine();
19
20
21  

 

6.密封类和密封方法 
1)对于一些永远也不想让别人继承我们用sealed来修饰它。
 
2)当然它的方法是不可重写的,也就是不可以定义为虚方法。
 
3)不能将sealed作用于方法。
1 密封类和密封方法例子:
2  sealed class FinalClass
3 {
4 //不能定义为虚方法,,因为本身这个类都是不需要继承的,那么定义为虚方法的意义就不大了
5 //public virtual void cal()
6 // {
7 // Console.WriteLine("cc");
8 // }
9  
10 public void cal()
11 {
12 Console.WriteLine("cc");
13 }
14 public static void StaCal()
15 {
16 Console.WriteLine("bb");
17 }
18 }
19  //密封类是不能继承的
20 //class DerivedClass : FinalClass
21 //{
22 //public override void cal()
23 //{
24 // Console.WriteLine("bb");
25 //}
26 //}
27  
28  

在子类中覆盖父类方法:

 

1)在子类中声明同样的方法
 
2)在子类中声明同样的方法,并用new修饰
 
3)在子类中声明同样的方法,用override来修饰,当然必须祖先要有virtual修饰。
base 引用父类方法:
1 public class aa
2 {
3 public void one()
4 {
5 Console.WriteLine("aa");
6 }
7 }
8 public class bb : aa
9 {
10 new public void one()
11 {
12 base.one();
13 Console.WriteLine("bb");
14 }
15 }
16  

 

 

7.类的修饰符

 

 

 

 

posted on 2010-03-15 14:56  MR_ke  阅读(8344)  评论(0编辑  收藏  举报

导航