C# 继承(3)持续更新

类继承 和 接口继承

类继承        一个类型派生于一个基类行,它拥有该基类型的所有成员字段和函数。

接口继承     一个类型继承函数的签名,不需要实现代码。 

多重继承

一个类派生自多个类。多重继承编写非常复杂,难维护。因此C# 不支持多重继承。但可以 派生自多个接口,多重接口继承。

结构和类

结构(值类型) 和 类(引用类型)。使用结构的一个限制是结构不支持继承,每个结构自动派生自System.ValueType。结构不能实现类型继承,但是实现接口继承。

  • 结构总是派生自 System.ValueType ,它们可以派生自任意多个接口。
  • 类总派生自 Syste.Object 或 用户选择的另一个类,它们还可以派生自任意多个接口。

实现继承

public class Money : MyBaseClass
{

}

C++ 支持 公共继承、私有继承的概念,要注意C#不支持私有继承。因此类名上没有 public 和 private 限定符,私有继承只会增加复杂性,所以C++也使用的非常少。

派生 类 和 接口

public class Money : MyBaseClass, IInterface1, IInterFace2
{

}

结构

public struct Money : IInterface1, IInterFace2
{

}

虚方法

C# 虚函数的概念与标准 OOP 的概念形同:可以在派生类中重写虚函数。除了构造函数以外,可以显式的声明 virtual 。而在Java中,所有的函数都虚函数。

public class MyBaseClass
{
    public virtual void VirtualMethod()
    {
        
    }
}

public class Money : MyBaseClass
{
    public override void VirtualMethod()
    {
        base.VirtualMethod();
    }
}

成员字段和静态函数都不能声明为virtual。

隐藏方法

签名相同的方法在基类和派生类中进行声明,但该方法没有分别声明为 virtual 和 override。派生类方法就会隐藏基类方法。使用new关键来隐藏方法。

public class MyBaseClass
{
    public new void VirtualMethod()
    {
        
    }
}

public class Money : MyBaseClass
{
    public void VirtualMethod()
    {
       
    }
}

调用基类方法

base.VirtualMethod();

抽象类 和 抽象函数

C# 允许把类 和 函数 声明 为 abstract。 抽象类不能实例化,而抽象函数不能直接实现,必须在非抽象的派生类中重写。抽象函数本身就是虚拟的,所以不能加 virtual 关键字。

C++中 抽象函数 称为 纯虚函数 。C# 称为 抽象函数。

abstract public class MyBaseClass
{
    public abstract void VirtualMethod();
}

public class Money : MyBaseClass
{
    public override void VirtualMethod()
    {
       
    }
}

密封类和密封方法

sealed  

  • 类 表示不能继承该类  
  • 方法  表示不能重写该方法
sealed public class MyBaseClass
{
    public void VirtualMethod()
    {
        
    }
}

string就是一个密封类。 sealed 也可以用在 重写函数 。防止别人重写函数。

派生类的构造函数

构造函数的执行顺序是由上向下进行,最先调用的总是基类的构造函数。

在层次结构中添加无参数的构造函数

public abstract class MyBaseClass
{
    private string name;
    public MyBaseClass() : base()
    {
        name = "<no name>";
    }
}

带参数的构造函数 

public abstract class MyBaseClass
{
    private string name;
    public MyBaseClass(string name)
    {
        this.name = name;
    }
}

public class Money : MyBaseClass
{
    public Money(string name) : base(name)
    {
        
    }
}

其他修饰符 

extern 调用外部 dll 时,使用。

[DllImport("avifil32.dll")]
private static extern void AVIFileInit();

介绍

http://blog.csdn.net/llddyy123wq/article/details/5620466

接口

public interface IDisposable
{
    void Dispose();
}

声明接口在语法上与声明抽象类相同,也不允许包含运算符重载,不能有构造函数,不能实现任何成员的实现方式。

派生接口类

public interface IDisposable
{
    void Dispose();
}

class MyClass : IDisposable
{
    public void Dispose()
    {
        
    }
}

接口名称通常以字母I开头,接口应用强大的之处在于,它可以引用任何实现该接口的类。

接口派生接口

public interface IBankAccount
{
    void PayIn(decimal amount);
    bool Withdraw(decimal amount);
    decimal Balance { get; }
}

public interface ITransferBankAccount : IBankAccount
{
    bool TransferTo(IBankAccount distination, decimal amount);
}

public class CurrentAccount : ITransferBankAccount
{
    public void PayIn(decimal amount)
    {
        
    }

    public bool Withdraw(decimal amount)
    {
       
    }

    public decimal Balance { get; }

    public bool TransferTo(IBankAccount distination, decimal amount)
    {
        
    }
}

 

posted @ 2016-08-15 18:01  笨重的石头  阅读(349)  评论(1编辑  收藏  举报