C# 为什么使用接口类型而不是实现声明接口的对象类型

C# 为什么使用接口类型而不是实现声明接口的对象类型,c#,interface,C#,Interface,学习C,我有一个随机的问题,我似乎无法理解。我见过声明接口类型变量的代码。例如:ISomeInterface someInterface=。。。而不是ClassImplementInInterface someObject= 1为什么要将变量声明为接口类型而不是实现它的实际对象 有优点还是缺点。。。这种做法是否附加了一个名称,以便我可以进一步了解它?我们可以这样做的一个实际例子是,我们希望对象在创建后在特定接口的约束范围内运行。考虑下面的代码: public static void Main()

学习C,我有一个随机的问题,我似乎无法理解。我见过声明接口类型变量的代码。例如:ISomeInterface someInterface=。。。而不是ClassImplementInInterface someObject=

1为什么要将变量声明为接口类型而不是实现它的实际对象


有优点还是缺点。。。这种做法是否附加了一个名称,以便我可以进一步了解它?

我们可以这样做的一个实际例子是,我们希望对象在创建后在特定接口的约束范围内运行。考虑下面的代码:

public static void Main()
{
    IReadableFruit fruit = new Apple("big");
    fruit.FruitSize = "small"; // this does not work!
    fruit.EatFruit(); // nor does this!

    Apple apple = new Apple("big");
    apple.FruitSize = "small"; // this does!
    apple.EatFruit(); //and so does this.
}

public interface IReadableFruit 
{
    string FruitSize { get; }
}

public interface IEdibleFruit 
{
    void EatFruit();
}

public class Apple : IReadableFruit, IEdibleFruit
{
    public string FruitSize { get; set; }

    public Apple(string fruitSize)
    {
        FruitSize = fruitSize;
    }

    public void EatFruit()
    {
        Console.WriteLine("om nom nom");
    }
}
在第一个实例化中,我们使用接口,接口将属性定义为可读的,但不一定是可写的;一旦我们实例化了水果,它现在只在IReadableFruit接口描述的范围内运行,即使实际的类继承自其他接口,或者在实现中有其他属性或方法可用


正如@Anzurio在他的评论中提到的,这是多态性的一个例子。

要回答你的第二个问题,这样做的实践叫做多态性。要回答第一个问题,这样你就可以解耦依赖关系。如果您使用接口,则用户可以传递实现它的任何内容,而您只关心接口公开的API。另请参见:香蕉和橙子都可以实现IHasPeel接口,但它们的基类水果却不能实现。您不必剥草莓皮。一个类描述的是什么,一个接口描述的是什么。另外,一个类可能只实现另一个类作为它的基础,但它可能实现许多不同的接口。