Resumo : neste tutorial, você aprenderá sobre a implementação de interface explícita em C# e como usá-la de maneira eficaz.
Introdução à implementação de interface explícita em C#
Em C#, uma classe pode implementar uma interface de duas maneiras: implícita e explicitamente. Por padrão, C# usa a implementação implícita. Por exemplo:
interface ILogger
{
void Log(string message);
}
class ConsoleLoger : ILogger
{
public void Log(string message) => Console.WriteLine(message);
}
class Program
{
public static void Main(string[] args)
{
var logger = new ConsoleLoger();
logger.Log("Hello");
}
}
Linguagem de código: C# ( cs )
Neste exemplo, definimos uma
interface com um método chamado ILogger
Log
, que registra uma mensagem. Em seguida, definimos uma
classe que implementa a ConsoleLogger
interface. A ILogger
classe implementa o ConsoleLogger
Log
método que registra uma mensagem no console.
No Main()
método da Program
classe, criamos uma nova instância da ConsoleLogger
classe e registramos uma mensagem no console.
Ao contrário da implementação de interface implícita, uma implementação de interface explícita exige que você especifique o nome da interface ao implementar o método. Por exemplo:
interface ILogger
{
void Log(string message);
}
class ConsoleLoger : ILogger
{
void ILogger.Log(string message) => Console.WriteLine(message);
}
class Program
{
public static void Main(string[] args)
{
ILogger logger = new ConsoleLoger();
logger.Log("Hello");
}
}
Linguagem de código: C# ( cs )
Neste exemplo, o
implementa a ConsoleLogger
ILogger
interface explicitamente. Portanto, prefixamos o nome da interface antes do nome do método, separados por um ponto (.). Além disso, não usamos um modificador de acesso ( public
) para o Log
método no arquivo
.ConsoleLogger
No Main()
método da Program
classe, só podemos acessar o Log
método através da
interface. A razão é que o ILogger
Log
método pertence à
interface, não à ILogger
classe, embora o implementemos na ConsoleLogger
classe.ConsoleLogger
Esta também é a razão pela qual o Log
método não possui o public
modificador de acesso. Em outras palavras, você não pode chamar o Log
método através de uma instância da ConsoleLogger
classe.
Portanto, o código a seguir não será compilado e resultará em erro:
ConsoleLoger logger = new ConsoleLoger();
logger.Log("Hello"); // error
Linguagem de código: C# ( cs )
Quando usar a implementação de interface explícita em C#
A implementação explícita da interface permite evitar conflitos de nomenclatura entre múltiplas interfaces.
Já que uma classe pode implementar múltiplas interfaces e essas interfaces podem ter membros com o mesmo nome. Para evitar o conflito de nomenclatura, você pode usar a implementação explícita da interface.
O exemplo a seguir demonstra como usar a implementação explícita da interface:
interface IWritable
{
void Write(string message);
}
interface ISavable
{
void Write(string message);
}
class TextFile : IWritable, ISavable
{
public string FileName { get; set; }
public TextFile(string filename)
{
FileName = filename;
}
void IWritable.Write(string message) => Console.WriteLine(message);
void ISavable.Write(string message) => File.WriteAllText(FileName, message);
}
class Program
{
public static void Main(string[] args)
{
var textFile = new TextFile(@"C:\temp\test.txt");
ISavable savable = textFile;
savable.Write("Hello");
IWritable writable = textFile;
writable.Write("Hello");
}
}
Linguagem de código: C# ( cs )
Como funciona.
Primeiro, defina a interface IWritable
e ISavable
que possui o mesmo método Write
.
Segundo, defina a TextFile
classe que implementa ambas IWritable
as ISavable
interfaces explicitamente.
Terceiro, crie uma nova instância de TextFile
e chame o método Write das interfaces via ISavable
e IWritable
interface respectivamente.
O programa grava a Hello
mensagem no console e em um C:\temp\test.txt
arquivo.
Resumo
- A implementação explícita de interface fornece uma maneira de implementar métodos de interface com um prefixo de interface específico (
interfaceName.methodName
). - A implementação explícita de interface é útil quando você tem uma classe que implementa múltiplas interfaces com o mesmo nome de método ou quando deseja evitar conflitos de nomenclatura entre interface e métodos de classe.
- A implementação explícita da interface garante que o método só possa ser acessado através da interface à qual pertence.