关于接口多态性一点说明

在讲述接口多态性时我们常看到类似的例子:

//接口
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 | 引用: 0 | 查看次数: 3498
发表评论
登录后再发表评论!