Преобразование реализации интерфейса из VB.NET в C # - PullRequest
3 голосов
/ 12 сентября 2010

Это может показаться очевидным ответом, но я не могу найти ответ.У меня есть этот код в VB.NET:

Public Interface ITestInterface
    WriteOnly Property Encryption() As Boolean
End Interface

И у меня также есть этот класс и реализация в VB.NET:

Partial Public Class TestClass
    Implements ITestInterface

    Public WriteOnly Property EncryptionVB() As Boolean Implements ITestInterface.Encryption
        Set(ByVal value As Booleam)
             m_Encryption = value
        End Set
    End Property
End Class

Я пытаюсь преобразовать это в C #.У меня интерфейс C # преобразуется просто отлично, вот так:

public interface ITestInterface
{
    bool Encryption { set; }
}

Проблема в том, как преобразовать реализацию.У меня есть это:

public partial class TestClass
{
    public bool Encryption 
    {
         set { m_Encryption = value; }
    }
}

Проблема в том, что в C # может показаться, что вы должны называть функцию так же, как и интерфейсную функцию, которую вы реализуете.Как я могу вызвать этот метод EncryptionVB вместо Encryption, но все же реализовать свойство Encryption?

Ответы [ 5 ]

5 голосов
/ 12 сентября 2010

Самым близким способом, который я могу придумать, является использование явной реализации:

public partial class TestClass : ITestInterface
{
    public bool EncryptionVB
    {
         ((ITestInterface)this).Encryption = value;
    }

    bool ITestInterface.Encryption { set; }
}

Теперь, на первый взгляд, это может выглядеть как «не то же самое».Но это действительно так.Примите во внимание тот факт, что в VB.NET, когда вы называете элемент, который реализует элемент интерфейса, что-то отличное от того, что определяет интерфейс, это «новое имя» появляется только тогда, когда вы знаете тип во время компиляции.

Итак:

Dim x As New TestClass
x.EncryptionVB = True

Но если бы x в приведенном выше коде было набрано как ITestInterface, это свойство EncryptionVB не было бы видимым.Он будет доступен только как Encryption:

Dim y As ITestInterface = New TestClass
y.Encryption = True

На самом деле он ведет себя точно так же, как , как явная реализация интерфейса в C #.Взгляните на эквивалентный код:

TestClass x = new TestClass();
x.EncryptionVB = true;

ITestInterface y = new TestClass();
y.Encryption = true;
4 голосов
/ 12 сентября 2010

C # не поддерживает псевдонимы членов интерфейса, как это делает VB.NET.

Лучшее совпадение будет выглядеть примерно так:

public partial class TestClass : ITestInterface{
  bool ITestInterface.Encryption {
    set { m_Encryption = value; }
  }

  public bool EncryptionVB {
    set { ((ITestInterface)this).Encryption = value; }
  }
}
2 голосов
/ 12 сентября 2010

Выполнить изменение, используя уровень защиты

public bool EncryptionVB {
    set { m_Encryption = value; }
}
bool ITestInterface.Encryption {
    set { EncryptionVB = value; }
}
0 голосов
/ 12 сентября 2010

VB.NET обладает множеством возможностей, и немногие из них не следуют полностью OOPS.Одним из таких является это.C # не позволяет реализовать интерфейс под другим именем.Я не знаю, почему это поддерживается VB.NET, может быть из-за обратной совместимости.

0 голосов
/ 12 сентября 2010

Это невозможно в C # - при реализации интерфейса члены должны иметь имя, определенное в интерфейсе.

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