木子屋 Dnawo's BLOG

关于接口多态性一点说明

👤 dnawo 📅 2009-05-09 👁 4026 👍 0 💬 0 🔄 本站原创
在讲述接口多态性时我们常看到类似的例子:

//接口
interface IAction
{
    void Move();
}

//类
class Anmial : IAction
{
    //实现接口成员
    public void Move()
    {
        Console.WriteLine("Go! Go! Go!");
    }
}

//调用
class Program
{
    static void Main(string[] args)
    {
        IAction action = new Anmial();
        action.Move();

        Console.ReadKey();
    }
}

这边Anmial类的Move方法是孤立的,和其他成员没有关系,如果Anmial类还有一个Name属性,Move方法如下:

public void Move()
{
    Console.WriteLine(Name + ",Go! Go! Go!");
}

现在的问题是,Name不是IAction的成员,我们不能使用多态性对它进行赋值,那怎么给这个Name赋值呢?看下边方法:

//接口
interface IAction
{
    void Move();
}

//类
class Anmial : IAction
{
    private string _name;

    /// <summary>
    /// 名字
    /// </summary>
    public string Name
    {
        set { _name = value; }
        get { return _name; }
    }

    //实现接口成员
    public void Move()
    {
        Console.WriteLine(Name + ",Go! Go! Go!");
    }
}

//调用
class Program
{
    static void Main(string[] args)
    {
        Anmial anmial = new Anmial();
        anmial.Name = "Jack";
        IAction action = anmial;
        action.Move();

        Console.ReadKey();
    }
}

这样接口多态性优势根本就无法显示出来了,解决方法是必须给Anmial添加一个非默认构造函数,在构造函数中必须可以给Name赋值!代码改后如下:

//接口
interface IAction
{
    void Move();
}

//类
class Anmial : IAction
{
    private string _name;

    /// <summary>
    /// 名字
    /// </summary>
    public string Name
    {
        set { _name = value; }
        get { return _name; }
    }

    //构造函数(必须)
    public Anmial(string name)
    {
        Name = name;
    }

    //实现接口成员
    public void Move()
    {
        Console.WriteLine(Name + ",Go! Go! Go!");
    }
}

//调用
class Program
{
    static void Main(string[] args)
    {
        IAction action = new Anmial("Jack");
        action.Move();

        Console.ReadKey();
    }
}

评论(0)

暂无评论。

计算题
评论需审核通过后显示
← 上一篇 C#格式化输出再讨论 下一篇 → Effective C# 原则6:区别值类型数据和引用类型数据