接口和类之间的差异
本文关键字:之间 接口 | 更新日期: 2023-09-27 18:07:44
正如标题所述,我想知道使用类似的类之间的区别
public class Account
{
public string Username { get; set; }
public string Password { get; set; }
}
和使用和接口类似的
public class Account : IAccount
{
public string Username { get; set; }
public string Password { get; set; }
}
public interface IAccount
{
string Username { get; set; }
string Password { get; set; }
}
我真的很困惑,因为我发现接口毫无用处,因为我所能做的一切都只能用Class来完成,因此,我需要有人帮我澄清。
接口是契约:它指定实现接口的类必须拥有哪些成员(方法和属性(。但因为它只是一个契约,所以它没有任何成员的实现。一个类可以实现零个、一个或多个接口。
相比之下:类是…嗯。。。对象的类(类似于分类法(。例如,Animal
是一类生物,Giraffe
是一类动物。继承表达了这种关系:当Giraffe
从Animal
继承时,Giraffe
是Animal
。它可以做动物能做的任何事情,甚至更多。它可以在中为其成员和提供实现。NET中,一个类将恰好从另一个类继承(除非另有指定,否则为Object
(。
因此,如果您想表示您的类遵守一个或多个约定:请使用接口。但是,您无法提供实现。如果你想表达你的类是的东西,那么扩展一个基类。在这种情况下,您可以提供一个实现,但只能扩展一个基类。
具体示例:
链表、数组列表、堆栈和字典有一些共同点:它们表示元素的集合。但它们的实现方式完全不同。他们唯一的共同点是他们遵守的合同:ICollection
。这意味着您的类可以请求一个集合,任何集合:实现ICollection
的任何东西,而不管其实现如何。
另一方面:汽车、摩托车和卡车也有一些共同点:它们都是轮式车辆。但他们有更多的共同点:他们都有一个马达,他们都旋转轮胎前进。从本质上讲,它们是Vehicle
类对象的成员,并且可以共享(部分(它们的实现。然而,虽然Truck
可能是Vehicle
和是CargoCarrier
,但您不能在C#中表达这一点。
基本上:
接口提供了一个
contract
,指定如何与对象对话,但没有指定该对象如何处理该请求的细节(除了参数和返回类型等(
和:
类(尤其是抽象类(提供了关于如何与对象对话的信息,但在某些情况下提供了实际实现(想想重写基类的方法(。
接口允许您定义对象之间通信的通用形式,而不必关心对象如何执行操作的细节。
一个例子是日志记录:
public interface ILog
{
void WriteMessage(string message);
}
public class ConsoleLogger : ILog
{
public void WriteMessage(string message)
{
Console.WriteLine(message);
}
}
public class MessageBoxLogger : ILog
{
public void WriteMessage(string message)
{
MessageBox.Show(message);
}
}
public void DoSomethingInteresting(ILog logger)
{
logger.WriteMessage("I'm doing something interesting!");
}
因为ConsoleLogger
和MessageBoxLogger
都实现了ILog
接口(WriteMessage
方法,代码的任何部分都可以接受ILog
,而不需要知道它实际做了什么,他们只关心它做了一些的事情——在这种情况下,写一条日志消息。
因此,在上面的代码中,ConsoleLogger
或MessageBoxLogger
都可以提供给DoSomethingInteresting
,这根本不重要,因为ILog
"知道"如何与该对象对话。