Dan*_*gen 9 c# interface class
正如标题所述,我想知道使用这样的类之间的区别
public class Account
{
public string Username { get; set; }
public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并使用和接口这样
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; }
}
Run Code Online (Sandbox Code Playgroud)
我真的很困惑,因为我发现接口是无用的,因为我可以用它做的只能使用Class,因此,我需要有人为我澄清一些事情.
Dan*_*ker 18
接口是契约:它指定实现接口的类必须具有的成员(方法和属性).但因为它只是一份合同,所以它的任何成员都没有实施.一个类可以实现零个,一个或多个接口.
相比之下:一个类是......好......一类对象(比如分类法).例如,a Animal是一类生物,a Giraffe是一类动物.继承表示这种关系:一个Giraffe 是 Animal当Giraffe从继承Animal.它可以做动物可以做的任何事情,甚至更多.它可以为其成员提供实现,而在.NET中,类将从其他一个类继承(Object除非另有说明).
因此,如果您想表达您的类遵守一个或多个合同:使用接口.但是,您无法提供实施.如果你想表达你的类是什么,扩展一个基类.在这种情况下,您可以提供实现,但是您只能扩展一个基类.
举个具体的例子:
链表,数组列表,堆栈和字典有一些共同点:它们代表元素的集合.但他们的实现完全不同.他们唯一的共同点是他们坚持的合同:ICollection.这意味着您的类可以请求集合,任何集合:任何实现的集合ICollection,无论其实现如何.
另一方面:汽车,摩托车和卡车也有一些共同点:它们是轮式车辆.但他们有更多共同之处:他们都有一个发动机,他们全都旋转轮胎前进.从本质上讲,它们是Vehicle对象类的成员,并且可以共享(部分)其实现.但是,虽然a Truck可能是a Vehicle 和 a CargoCarrier,但你无法用C#表达.
Cli*_*int 13
基本上:
接口提供
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!");
}
Run Code Online (Sandbox Code Playgroud)
因为无论ConsoleLogger和MessageBoxLogger实现ILog接口(该WriteMessage方法,代码的任何部分都可以采取ILog甚至无需知道它实际上做,他们只关心它的东西 -在这种情况下,写日志信息.
因此,在上面的代码中,a ConsoleLogger或者MessageBoxLogger可以提供给DoSomethingInteresting它并不重要,因为ILog"知道"如何与该对象通信.