Analise o código a seguir retirado de uma aplicação desenvol...
interface IDimensions
{
float Length();
float Width();
}
class Box : IDimensions
{
float lengthInches;
float widthInches;
public Box(float length, float width)
{
lengthInches = length;
widthInches = width;
}
float IDimensions.Length()
{
return lengthInches;
}
float IDimensions.Width()
{
return widthInches;
}
public static void Main()
{
Box myBox = new Box(30.0f, 20.0f);
IDimensions myDimensions = (IDimensions) myBox;
System.Console.WriteLine("Length: {0}", myBox.Length());
System.Console.WriteLine("Width: {0}", myDimensions.Width());
}
}
Sobre o código apresentado é correto afirmar que a instrução
Gabarito comentado
Confira o gabarito comentado por um dos nossos professores
A alternativa correta é a D. Vamos entender o motivo.
O código apresentado em C# está utilizando um conceito conhecido como implementação explícita de interface. Isso significa que ao implementar os métodos de uma interface, o nome da interface é usado como um prefixo para os nomes dos métodos, indicando que esses métodos só estarão acessíveis através de uma referência ao tipo da interface. Isso é útil para resolver conflitos de nomes quando uma classe implementa múltiplas interfaces que possuem métodos com o mesmo nome.
No código fornecido, a classe Box implementa uma interface chamada IDimensions. Os métodos Length()
e Width()
são implementados explicitamente, o que significa que só podem ser chamados através de uma referência à interface IDimensions
, e não de uma referência a um objeto Box
diretamente. Portanto, a linha:
System.Console.WriteLine("Length: {0}", myBox.Length());
irá resultar em um erro de compilação, já que o método Length()
só é acessível através de uma referência ao tipo IDimensions
, e não diretamente pelo objeto myBox
do tipo Box
. Por essa razão, a alternativa D é a correta.
As outras alternativas estão incorretas por diversos motivos:
- A: A linha
System.Console.WriteLine("Width: {0}", myDimensions.Width());
é válida porquemyDimensions
é do tipoIDimensions
e pode acessar o métodoWidth()
. - B: O construtor da classe
Box
está correto e aceita valores de ponto flutuante, que em C# são indicados com umf
após o número, para representar umfloat
literal. - C: O cast
(IDimensions) myBox
é válido e necessário para atribuir um objeto de uma classe a uma referência de interface que a classe implementa. - E: Em C#, para indicar que uma classe implementa uma interface, utiliza-se a palavra-chave
:
ao invés deimplements
, que é usada em Java. Portanto, a declaração da classe está correta.
Para resolver questões como esta, é essencial ter conhecimento sobre interfaces, implementação explícita e implícita de métodos de interface, e como esses conceitos são aplicados na linguagem C#.
Clique para visualizar este gabarito
Visualize o gabarito desta questão clicando no botão abaixo
Comentários
Veja os comentários dos nossos alunos
Alguém comenta?
Formatação ordinaria de quem transcreveu
interface IDimensions
{
float Length();
float Width();
}
class Box : IDimensions
{
float lengthInches;
float widthInches;
public Box(float length, float width)
{
lengthInches = length; widthInches = width;
}
float IDimensions.Length()
{
return lengthInches;
}
float IDimensions.Width()
{
return widthInches;
}
public static void Main()
{
Box myBox = new Box(30.0f, 20.0f);
IDimensions myDimensions = (IDimensions)myBox;
System.Console.WriteLine("Length: {0}", myBox.Length());
System.Console.WriteLine("Width: {0}", myDimensions.Width());
}
}
Linha Correta seria: System.Console.WriteLine("Length: {0}", myDimensions.Length());
Gab D: produzirá um erro de compilação porque um membro de uma interface que é explicitamente implementado não pode ser acessado a partir de uma instância de classe, mas apenas através de uma instância da interface.
Clique para visualizar este comentário
Visualize os comentários desta questão clicando no botão abaixo