请清楚 - 要在c#中实现运行时多态性,我们使用Interface?

时间:2014-01-05 08:22:51

标签: c# polymorphism

请清楚run time polymorphism

这是真的吗?

  

要在c#中实现运行时多态性,我们使用Interface?

     

我已经浏览了SO上的所有帖子。答案并不是直截了当的矛盾。我希望在YES / NO中回答,请帮助我

2 个答案:

答案 0 :(得分:3)

嗯,这不是虚假陈述。您可以使用接口实现动态/运行时多态(后期绑定),但您也可以使用基类或抽象类,其中底层具体类型在运行时确定。后期绑定的一个例子。 ..

假设您有以下界面

interface IOrder
{
    void ProcessOrder(int orderId);
    void ProcessOrder(int orderId, int userId);
 }

然后你有一个实现这个界面的订单对象......

public StoreAOrder : IOrder {...}

然后使用依赖注入来处理订单......

public class OrderProcessor
{
    private IOrder order;

    public OrderProcessor(IOrder _order)
    {
        order = _order;
     }


    public void Process()
    {
        order.ProcessOrder(id, User.Current.Id);
     }
}

请注意,在编译时,OrderProcessor并不真正知道实现IOrder的具体类是什么。此外,它不知道底层对象暴露的重载。这就是所谓的运行时多态性。

答案 1 :(得分:1)

您不必为此定义单独的接口。您还可以使用基类来实现多态性。

有关详细信息,请查看此页:

Polymorphism - C# programming

在C#中使用多态的示例:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Animals
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Animal> animals = new List<Animal>();
            animals.Add(new Dog());
            animals.Add(new Cat());

            foreach(Animal animal in animals)
            {
                animal.PrintWhoAreYou();
            }

            Console.ReadKey();
        }
    }

    abstract class Animal
    {
        public abstract void PrintWhoAreYou();

        private bool feeded = false;

        public void Feed()
        {
           feeded = true;
        }
    }

    class Dog : Animal
    {
        public override void PrintWhoAreYou()
        {
            Console.WriteLine("I am a dog!");
        }
    }
    class Cat : Animal
    {
        public override void PrintWhoAreYou()
        {
            Console.WriteLine("I am a cat!");
        }
    }
}

正如您所看到的,您可以使用基类定义基类中的常用功能,而不是重复代码。

您可以使用接口来定义一组公共方法,这些公共方法由实现此接口的类提供。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Animals
{
    class Program
    {
        static void Main(string[] args)
        {
            List<IAnimal> animals = new List<IAnimal>();
            animals.Add(new Dog());
            animals.Add(new Cat());

            foreach(Animal animal in animals)
            {
                animal.PrintWhoAreYou();
            }

            Console.ReadKey();
        }
    }

    interface IAnimal
    {
        void PrintWhoAreYou();
    }

    abstract class Animal : IAnimal
    {
        public abstract void PrintWhoAreYou();

        private bool feeded = false;

        public void Feed()
        {
            feeded = true;
        }

    }

    class Dog : Animal
    {
        public override void PrintWhoAreYou()
        {
            Console.WriteLine("I am a dog!");
        }
    }
    class Cat : Animal
    {
        public override void PrintWhoAreYou()
        {
            Console.WriteLine("I am a cat!");
        }
    }
}