C#有关继承的知识点
1.继承的定义和声明格式
通过继承我们可以定义新类。已存在的类称为基类(base class),新类称为派生类(derived class)。
派生类扩展它的基类,不能删除它所继承的任何成员。
声明格式如下:
class OtherClass : SomeClass
{
...
}
2.访问继承的成员
继承的成员可以被访问,就像派生类自己声明的一样。
所有类都派生自object类,object类是唯一的非派生类,它是继承结构的基础。
代码例子如下:
class SomeClass
{
public string Field1 = "base class";
public void method1(string value)
{
Console.WriteLine("Base Class -- Method1: {0}" ,value);
}
}
class OtherClass : SomeClass
{
public string Field2 = "dribed class";
public void method2(string value)
{
Console.WriteLine("Drived Class -- Method2: {0}" , value);
}
}
class Program
{
static void Main(string[] args)
{
OtherClass oc = new OtherClass();
oc.method1(oc.Field1);
oc.method1(oc.Field2);
oc.method2(oc.Field1);
oc.method2(oc.Field2);
}
}
3.屏蔽基类的成员
派生类不能删除它继承的任何成员,但是可以用与基类成员名称相同的成员来屏蔽(mask)基类成员。
(1)要屏蔽一个继承的数据成员,需要一个新的相同类型的成员,并使用相同的名称。
(2)使用new修饰符,可以让编译器“故意”屏蔽继承成员,否则,编译器会警告:隐藏了一个继承成员。
(3)也可以屏蔽静态成员。
class SomeClass
{
public string Field1 = "base class";
public void method1(string value)
{
Console.WriteLine("Base Class -- Method1: {0}" ,value);
}
}
class OtherClass : SomeClass
{
new public string Field1 ;
new public void method1(string value)
{
Console.WriteLine("Base Class -- Method1: {0}" ,value);
}
}
4.基类访问
如果派生类必须访问被隐藏的继承成员,可以使用基类访问表达式。
Console.WriteLine("{0}" ,base.Field1);
5.使用基类引用(使用类型转换符)
派生类的实例由基类的实例加上派生类新增的成员组成,派生类的引用指向整个类的对象,包括基类部分。
如果有一个派生类对象的引用,就可以获取对象基类部分的引用。
MyDerivedClass derived = new MyDerivedClass() ;
MyBaseClass mvcl = new (MyBaseClass )derived ;//转换引用
6.虚方法和复写方法
虚方法可以使基类的引用访问“升至”派生类
class MybaseClass
{
virtual public void Print()
{
Console.WriteLine("This is the base class.");
}
}
class MyDerivedClass : MybaseClass
{
public override void Print()
{
Console.WriteLine("This is the derived class.");
}
}
class Program
{
static void Main(string[] args)
{
MyDerivedClass derive = new MyDerivedClass();
MybaseClass mybc = (MybaseClass)derive ;
derive.Print();
mybc.Print();
}
}
7.派生类成员的构造函数
创建一个实例过程
(1)初始化对象的所有实例化成员
(2)调用基类的构造函数
(3)执行自己的构造函数
8.抽象类
抽象类是指设计为被继承的类,抽象类只能被用作其他类的基类。
不能创建抽象类的实例。
数据成员(字段和常量)不能被申明abstract
声明:
abstract class MyClass
{
}
9.静态类
静态类中的所有成员都是静态的。静态类用于存放不受实例数据影响的数据和函数。静态类的一个常见用途可能就是创建一个包含一组数学方法和值的数学库。
类本身必须标记为static
类的所有成员必须是静态的
类可以有一个静态构造函数,但不能有实例构造函数。
静态类是密封的,不能继承静态类。
static public class Mymath
{
public static float PI = 3.14F;
public static bool IsOdd(int x)
{
return (x % 2 == 1);
}
public static int Times(int x)
{
return (2 * x) ;
}
}
%取余运算符 5 % 2 = 1 ;
2 % 5 = 2 ;
存在负号时
if |x| > |y| reasult : x + y ; -6 % 5 = 1
else result : x ; 6 % 5 = 1;
5 % -6 = 5 ;
10.扩展方法
几种方法可以实现增加类的额外功能
(1)假如有源代码,我们可以修改类,增加一个新方法。
(2)如果不能修改类(类在第三方库中),只要它不是密封,我们可以继承它。
(3)在另一个类中,使用该类的共有成员再编写一个方法。
介绍扩展方法,代码如下
sealed class MyData
{
private double D1, D2, D3;
public MyData(double d1 , double d2 , double d3)
{
D1 = d1; D2 = d2; D3 = d3;
}
public double Sum() { return D1 + D2 + D3; }
}
static class ExtendMyData //扩展方法的类必须声明为static
{
public static double Average(this MyData md) //扩展方法本身必须声明为static 关键字this必须作为第一个参数
{
return md.Sum() / 3;
}
}
class Program
{
static void Main(string[] args)
{
MyData md = new MyData(3 , 4 , 5);
Console.WriteLine("Average: {0}", md.Average());
}
}