我试图了解C#中的高级OOP概念。可以说我有一个从这个接口派生的接口和类。那么,为什么在创建对象或将参数传递给某个方法时我们需要将decleare接口作为类型?
interface ILetter
{
void Read();
}
class LoveLetter : ILetter
{
public void Read(){
Console.WriteLine("Love Letter Reading");
}
}
class Program
{
static void Main(string[] args)
{
ILetter myLetter = new LoveLetter();
myLetter.Read();
//Output : "Love Letter Reading"
LoveLetter mySecondLetter = new LoveLetter();
mySecondLetter.Read();
//Output : "Love Letter Reading"
}
}
答案 0 :(得分:3)
通过接口而不是具体类型访问方法(实现某些功能)使您可以灵活地更改所访问功能的实现,而无需更改该功能的客户端。
假设我们有ILogger
接口
public interface ILogger
{
void Log(string message);
}
此界面的客户
public class SomeService
{
private readonly ILogger _logger;
public SomeService(ILogger logger)
{
_logger = logger;
}
public void SomeMethod()
{
_logger.Log("Some message");
}
}
您可以创建ILogger
的具体实现,让我们说ConsoleLogger
和FileLogger
并将它们传递到SomeService
可互换,这样您就可以修改SomeMethod
的结果("Message"
将记录到Console
或文件中)而不修改SomeService
。因此,我们使用Dependency Injection反转控件。
答案 1 :(得分:1)
在第一种情况下,您只接触界面中的方法(推荐方式),而在后一种情况下,您将公开该类型中的所有公共内容。
在类型中创建一个公共方法并尝试在两种情况下访问他,您将看到有什么区别。
强烈建议您针对抽象而不是具体类型进行编程。
答案 2 :(得分:1)
使用接口可以提供灵活性,这意味着您不依赖于某个特定的类/实现。
假设您有另一个字母类。
class LeaveApplicationLetter : ILetter
{
public void Read(){
Console.WriteLine("I'm on vacation");
}
}
您可以使用该界面的其他实现。
class Program
{
static void Main(string[] args)
{
ILetter myLetter = new LoveLetter();
myLetter.Read();
//Output : "Love Letter Reading"
myLetter = new LeaveApplicationLetter ();
myLetter.Read();
//Output : "I'm on vacation"
LoveLetter mySecondLetter = new LoveLetter();
mySecondLetter.Read();
//Output : "Love Letter Reading"
}
}
有关更深层次的样本和解释,请参阅此文章。 C# interfaces - What's the point?
答案 3 :(得分:0)
我们不能说我们来自'从界面我们说一个类'实现'界面。
如果我们依赖于接口而不是类,则意味着我们的类可以处理更一般的情况。
例如,我们可以使用方法发送信件
Send(ILetter message){....}
我们可以使用此消息发送任何实现ILetter的字母。例如Class Bill : ILetter {...}
如果我们没有界面,我们就必须拥有
Send(LoveLetter message){....}
Send(Bill message){....}
答案 4 :(得分:0)
你已经得到了几个答案,讨论了使用interface
的优点,但是它们都没有解决一个更简单,更基本的问题:你在询问OOP和class
es不是C♯中的OOP,只有interface
是。
如果你想在C♯中进行面向对象的编程,你必须只使用interface
作为类型。 class
es和struct
定义抽象数据类型,而不是对象类型,只有interface
定义对象类型。
我试图了解C#
中的高级OOP概念
这在C♯中甚至不是一个先进的OOP概念,它是C♯中OOP的基础,这是一个非常基本的概念,可能是 最基本的概念。
如果您想了解有关抽象数据类型和对象之间差异的更多信息(包括示例),那么您最好不要通过On Understanding Data Abstraction, Revisited阅读辉煌的William R. Cook。在文章中,库克没有具体谈论C♯,但他所说的很容易转移到C♯。