Многоуровневое наследование интерфейса с .NET и COM Interop - PullRequest
1 голос
/ 18 июня 2010

Этот вопрос является продолжением моего последнего вопроса со ссылкой на COM Interop.

Допустим, у меня есть следующие 2 интерфейса и реализующие классы:

public interface ISkuItem 
{ 
    public string SKU { get; set; } 
} 

public interface ICartItem : ISkuItem 
{ 
    public int Quantity { get; set; } 
    public bool IsDiscountable { get; set; } 
} 

public class CartItem : ICartItem
{
    //implemented properties...
}

Или в VB.NET:

Public Interface ISkuItem
    Property SKU() As String
End Interface

Public Interface ICartItem
    Inherits ISkuItem
    Property Quantity() As Integer
    Property IsDiscountable() As Boolean
End Interface

Public Class CartItem
    Implements ICartItem

    'Implemented Properties'
End Class   

Интерфейсы важны в COM-взаимодействии для предоставления свойств и методов IntelliSense в IDE VB6 (согласно этой статье ). Однако, поскольку ICartItem наследуется от ISkuItem, SKU явно не определен в ICartItem и, следовательно, не отображается в IntelliSense в VB6 и даже выдает ошибку компилятора при попытке записи в objCartItem.SKU.

Я пытался использовать Shadows и Overloads в свойстве SKU в ISkuItem, но затем компилятор хочет, чтобы я явно реализовал SKU для и ISkuItem, и ICartItem в пределах CartItem класса. Я не думаю, что это то, что я хочу.

Есть ли способ (либо в VB.NET, либо в C #) явно объявить свойство SKU в ICartItem без необходимости повторного объявления SKU в классе CartItem?

Ответы [ 2 ]

2 голосов
/ 18 июня 2010

Если вам не нужны разные реализации для каждого интерфейса, на самом деле вы просто хотите неявно определить реализации.

... C # ...

public interface ISkuItem
{
    string SKU { get; set; }
}
public interface ICartItem : ISkuItem
{
    new string SKU { get; set; }
}
public class CartItem : ICartItem
{
    public string SKU { get; set; }
}

... VB.Net ...

Public Interface ISkuItem
    Property SKU() As String
End Interface

Public Interface ICartItem
    Inherits ISkuItem
    Shadows Property SKU() As String
End Interface

Public Class CartItem
    Implements ICartItem

    Private _sku As String
    Public Property SKU() As String Implements ICartItem.SKU, ISkuItem.SKU
        Get
            Return _sku
        End Get
        Set(ByVal value As String)
            _sku = value
        End Set
    End Property

End Class
1 голос
/ 18 июня 2010

Вы можете сделать так, как предлагает Мэтью, и предоставить нового (Shadows) SKU члена ICartItem. Но, как я уверен, вы понимаете, это в значительной степени делает ваше наследование интерфейса бесполезным.

Похоже, что эта модель наследования интерфейса вам не подходит.

Вы уверены, что обладание ICartItem наследованием от ISkuItem на самом деле вам что-нибудь дает?

Вместо того, чтобы страдать от головной боли из-за этого, я, вероятно, был бы склонен просто ICartItem предложить свое собственное свойство SKU и вообще не наследовать от ISkuItem. Тогда любой класс, реализующий ICartItem, может дополнительно также явно реализовывать ISkuItem (как это делают многие классы коллекций в .NET, например, с ICollection<T> и ICollection); но в любом случае он будет иметь свойство SKU.

Это не тот выбор дизайна, который я бы сделал в общем , обратите внимание (я бы пошел с тем, что у вас есть); но когда дело доходит до взаимодействия COM, иногда вам просто приходится жертвовать, потому что вы не хотите вечно биться головой о стену.

Я не уверен, что вы получите очень удовлетворительный ответ на этот вопрос. VB6 просто не понимает всего, что делает .NET, поэтому вы не сможете найти идеальное соотношение 1: 1 функций .NET к эквивалентам COM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...