Digamos que he 2 interfaces definidas así:herencia de varios niveles con implementos en características en VB.NET vs C#
public interface ISkuItem
{
public string SKU { get; set; }
}
public interface ICartItem : ISkuItem
{
public int Quantity { get; set; }
public bool IsDiscountable { get; set; }
}
Cuando voy a implementar la interfaz en C#, VS produce el siguiente código de plantilla :
public class CartItem : ICartItem
{
#region ICartItem Members
public int Quantity { get {...} set {...} }
public bool IsDiscountable { get {...} set {...} }
#endregion
#region ISkuItem Members
public string SKU { get {...} set {...} }
#endregion
}
En VB.NET, la misma clase se construye de esta manera:
Public Class CartItem
Implements ICartItem
Public Property IsDiscountable As Boolean Implements ICartItem.IsDiscountable
'GET SET'
End Property
Public Property Quantity As Integer Implements ICartItem.Quantity
'GET SET'
End Property
Public Property SKU As String Implements ISkuItem.SKU
'GET SET'
End Property
End Class
VB.NET explícitamente requiere que agregue Implements IInterfaceName.PropertyName
después de cada propiedad que se implementa, mientras que C# simplemente usa region
para indicar qué propiedades y métodos pertenecen a la interfaz.
Curiosamente en VB.NET, en la propiedad SKU
, puedo especificar Implements ISkuItem.SKU
o Implements ICartItem.SKU
. Aunque la plantilla creada por VS tiene como valor predeterminado ISkuItem
, también puedo especificar ICartItem
si así lo deseo. Curiosamente, como C# solo usa region
para bloquear las propiedades heredadas, parece que no puedo especificar explícitamente la interfaz de implementación de SKU
en C# como puedo en VB.NET.
Mi pregunta es: ¿Hay alguna importancia detrás de poder especificar una interfaz u otra para implementar propiedades en VB.NET, y si es así, hay una manera de imitar esta funcionalidad en C#? Además, ¿cuál es el efecto de especificar una interfaz sobre otra cuando se implementan propiedades?
Este es un punto diferente. El contrato 'ICartItem.SKU' no se puede explicitar porque no forma parte explícita de' ICartItem' –
@Matthew: Bueno, podrías verlo de esa manera también; mi punto es que estos no son dos miembros diferentes, como lo serían si las interfaces no estuvieran relacionadas. Creo que el hecho de que en VB.NET pueda especificar 'Implements ISkuItem.SKU' ** o **' Implements ICartItem.SKU' hace que esto sea un poco más claro también. –
BTW ... si crea una instancia de 'CartItem' no podrá acceder a la propiedad' SKU' a menos que lo ladee en la interrelación de 'ISkuItem' (suponiendo que agregue' SKU' a 'ICartItem' así que ejemplo compilará.) –