请清楚run time polymorphism
这是真的吗?
要在c#中实现运行时多态性,我们使用Interface?
我已经浏览了SO上的所有帖子。答案并不是直截了当的矛盾。我希望在YES / NO中回答,请帮助我
答案 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)
您不必为此定义单独的接口。您还可以使用基类来实现多态性。
有关详细信息,请查看此页:
在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!");
}
}
}