2015-07-12 4 views
0

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

У меня есть три файла:

  1. CustomPaintRichText.vb
  2. IUnderlineableSpellingControl.vb
  3. ISpellingControl.vb

То же самое с C#, но в C# это работает отлично, и я хочу попытаться заставить его работать так же, как в VB.net.

CustomPaintRichText.vb:

Public Class CustomPaintRichText 
Inherits RichTextBox 
Implements IUnderlineableSpellingControl 

Public m_underlinedSections As Dictionary(Of Integer, Integer) 
Public m_protectedSections As Dictionary(Of Integer, Integer) 
Public m_ignoredSections As Dictionary(Of Integer, Integer) 
Public Property UnderlinedSections() As Dictionary(Of Integer, Integer) 
    Get 
     If m_underlinedSections Is Nothing Then 
      m_underlinedSections = New Dictionary(Of Integer, Integer)() 
     End If 
     Return m_underlinedSections 
    End Get 
    Set(value As Dictionary(Of Integer, Integer)) 
     m_underlinedSections = value 
    End Set 
End Property 

Public WriteOnly Property ProtectedSections() As Dictionary(Of Integer, Integer) 
    Set(value As Dictionary(Of Integer, Integer)) 
     m_protectedSections = value 
    End Set 
End Property 

Public WriteOnly Property IgnoredSections() As Dictionary(Of Integer, Integer) 
    Set(value As Dictionary(Of Integer, Integer)) 
     m_ignoredSections = value 
    End Set 
End Property 

Private spellingEnabled As Boolean 
Private spellingAutoEnabled As Boolean 
Private m_isPassWordProtected As Boolean 

Private penColour As Pen 
Public Property WhatPenColour() As Pen 
    Get 
     Return penColour 
    End Get 
    Set(value As Pen) 
     penColour = value 
    End Set 
End Property 

Public Property IsSpellingEnabled() As Boolean 
    Get 
     Return spellingEnabled 
    End Get 
    Set(value As Boolean) 
     spellingEnabled = value 
    End Set 
End Property 

Public Property IsSpellingAutoEnabled() As Boolean 
    Get 
     Return spellingAutoEnabled 
    End Get 
    Set(value As Boolean) 
     spellingAutoEnabled = value 
     If Not spellingEnabled Then 
      spellingEnabled = value 
     End If 
    End Set 
End Property 

Public Property IsPassWordProtected() As Boolean 
    Get 
     Return m_isPassWordProtected 
    End Get 
    Set(value As Boolean) 
     m_isPassWordProtected = value 
    End Set 
End Property 
End Class 

IUnderlineableSpellingControl.vb:

Public Interface IUnderlineableSpellingControl 
    Inherits ISpellingControl 
    Inherits IUnderlineable 
End Interface 

ISpellingControl.vb:

Public Interface ISpellingControl 
<Browsable(True)> _ 
Property IsSpellingEnabled() As Boolean 
Property SelectionStart() As Integer 
Property SelectionLength() As Integer 
Property SelectedText() As String 
Property Text() As String 
Property ContextMenuStrip() As ContextMenuStrip 
Property WhatPenColour() As Pen 
Property Parent() As Control 
Event Disposed As EventHandler 
Event Enter As EventHandler 
Event TextChanged As EventHandler 
Property [ReadOnly]() As Boolean 
ReadOnly Property IsPassWordProtected() As Boolean 
Sub Cut() 
Sub Copy() 
Sub Paste(clipFormat As DataFormats.Format) 
Sub [Select](start As Integer, length As Integer) 
Function Focus() As Boolean 
Sub Invalidate(invalidateChildren As Boolean) 
WriteOnly Property IgnoredSections() As Dictionary(Of Integer, Integer) 
End Interface 

Если я держу Carret курсора рядом с Implements IUnderlineableSpellingControl и нажмите клавишу ENTER, в классе CustomPaintRichText.vb, я получаю:

Public Property ContextMenuStrip1 As ContextMenuStrip Implements ISpellingControl.ContextMenuStrip 

Public Sub Copy1() Implements ISpellingControl.Copy 

End Sub 

Public Sub Cut1() Implements ISpellingControl.Cut 

End Sub 

Public Event Disposed1(sender As Object, e As EventArgs) Implements ISpellingControl.Disposed 

Public Event Enter1(sender As Object, e As EventArgs) Implements ISpellingControl.Enter 

Public Function Focus1() As Boolean Implements ISpellingControl.Focus 

End Function 

Public WriteOnly Property IgnoredSections1 As Dictionary(Of Integer, Integer) Implements ISpellingControl.IgnoredSections 
    Set(value As Dictionary(Of Integer, Integer)) 

    End Set 
End Property 

Public Sub Invalidate1(invalidateChildren As Boolean) Implements ISpellingControl.Invalidate 

End Sub 

Public ReadOnly Property IsPassWordProtected1 As Boolean Implements ISpellingControl.IsPassWordProtected 
    Get 

    End Get 
End Property 

Public Property IsSpellingEnabled1 As Boolean Implements ISpellingControl.IsSpellingEnabled 

Public Property Parent1 As Control Implements ISpellingControl.Parent 

Public Sub Paste1(clipFormat As DataFormats.Format) Implements ISpellingControl.Paste 

End Sub 

Public Property ReadOnly1 As Boolean Implements ISpellingControl.ReadOnly 

Public Sub Select1(start As Integer, length As Integer) Implements ISpellingControl.Select 

End Sub 

Public Property SelectedText1 As String Implements ISpellingControl.SelectedText 

Public Property SelectionLength1 As Integer Implements ISpellingControl.SelectionLength 

Public Property SelectionStart1 As Integer Implements ISpellingControl.SelectionStart 

Public Property Text1 As String Implements ISpellingControl.Text 

Public Event TextChanged1(sender As Object, e As EventArgs) Implements ISpellingControl.TextChanged 

Public Property WhatPenColour1 As Pen Implements ISpellingControl.WhatPenColour 

Public Sub CustomPaint1() Implements IUnderlineable.CustomPaint 

End Sub 

Public Property IsSpellingAutoEnabled1 As Boolean Implements IUnderlineable.IsSpellingAutoEnabled 

Public Event KeyDown1(sender As Object, e As KeyEventArgs) Implements IUnderlineable.KeyDown 

Public WriteOnly Property ProtectedSections1 As Dictionary(Of Integer, Integer) Implements IUnderlineable.ProtectedSections 
    Set(value As Dictionary(Of Integer, Integer)) 

    End Set 
End Property 

Public Sub RemoveWordFromUnderliningList1(wordStart As Integer) Implements IUnderlineable.RemoveWordFromUnderliningList 

End Sub 

Public Event SelectionChanged1(sender As Object, e As EventArgs) Implements IUnderlineable.SelectionChanged 

Public Property UnderlinedSections1 As Dictionary(Of Integer, Integer) Implements IUnderlineable.UnderlinedSections 

И когда я внести изменения в CustomPaintRichText от формы, я буду иметь дополнительный дополнительный и в конечном счете ничего не работает.

ошибка находится в Implements IUnderlineableSpellingControl. Подчеркивается, что: «CustomPaintRichText» должен реализовать «Событие, выставленное (отправитель как объект, e As System.EventArgs)» для интерфейса «ISpellingControl». Это одна из 30 ошибок, а также ... возможность реализации .. для интерфейса.

Вот error list, если вы хотите увидеть, какие ошибки я получаю.

Вот .cs файлы в случае, если:

  1. CustomPaintRichText.cs
  2. IUnderlineableSpellingControl.cs
  3. ISpellingControl.cs
+2

где в этой гигантской стене кода есть ошибки? Ошибки спецификатора интерфейса должны быть ошибками компилятора, но «ничего не работает» похоже на компиляцию. – Plutonix

+0

Опция Явная информация и посмотреть, скомпилирована ли она? –

+2

«Интерфейс» - это не волшебное заклинание. В любом из этих методов или свойств тела нет кода, поэтому они не делают ничего, что могло бы объяснить, почему «ничего не работает» – Plutonix

ответ

2

Поздравляем, вы сделали Ханса Пассана «Ух!». :)

Говоря с его точки зрения, смешивание и сопоставление сборок, скомпилированных из VB, C#, C++/CLI, F # или любого другого, обычно рекомендуется в мире .NET и является практическим решением вашей проблемы. Однако, если вы настаиваете на преобразовании этого проекта C# в его эквивалент VB, нужно понять различия в том, как интерфейсы реализуются между этими двумя языками.

C# имеет два стиля реализации: неявный и явный (см. http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and-explicit-interface-implementations.aspx). VB имеет только явный стиль, который не работает совсем как C# (см. https://msdn.microsoft.com/en-us/library/28e2e18x.aspx).

Все эти ошибки должны «выполнять» означают в значительной степени то, что они говорят: вы должны использовать ключевое слово Implements в соответствующих членах вашего подкласса, потому что VB не выполняет неявные реализации интерфейсов. Это вещь C#. Когда вы нажмете клавишу ENTER с курсором курсора рядом с Implements IUnderlineableSpellingControl, IDE сгенерировал код шаблона для затронутых (явно отсутствующих) членов, в комплекте с Implements. Он сделал это, пытаясь быть полезным, но в этом случае вам нужно просмотреть код и поместить в пункты Implements, где они нужны (и, вероятно, избавиться от этого кода шаблона).

C# имеет аккуратный неявный стиль, где он будет автоматически «внедряться» в реализации, сопоставляя имена членов между вашим классом и реализуемыми интерфейсами. Если должно быть несколько интерфейсов, имеющих один и тот же элемент (с одной и той же сигнатурой), все они будут реализованы с одним и тем же членом в вашем классе (см. http://blogs.msdn.com/b/mhop/archive/2006/12/12/implicit-and-explicit-interface-implementations.aspx). Это может быть замечательно или не очень-то хорошо, в зависимости от ситуации.

C# имеет ограниченный явный стиль. Один просто определяет член в названии в формате InterfaceName.MemberName (см. https://msdn.microsoft.com/en-us/library/ms173157.aspx).

VB имеет только свой явный стиль, но он позволяет использовать список членов интерфейса в предложении Implements, чтобы все они были реализованы одним и тем же членом в вашем классе. Это непротиворечивость для неявных реализаций C#, которые соединяют несколько интерфейсов.

Наконец, есть некоторые источники, которые утверждают, что VB не может выполнять повторные реализации интерфейса в подклассе суперкласса, который уже реализован (например, http://www.dotnetheaven.com/article/how-to-re-implement-interfaces-in-vb.net). Я не знаю, действительно ли это было правдой, но я могу утверждать, что VB VS 2012 и более поздние версии допускают такие повторные реализации.

+0

Я думаю, что я должен получить дополнительную репутацию за то, что сделал Ханс Пассант. Я пришел к выводу, что я должен просто придерживаться C#, но я ценю подробное объяснение. – Zer0

0

C# позволяет реализовать WriteOnly или ReadOnly свойство с чтения/записи свойства , (VB 2015 также позволяет это). Вы можете легко обойти эту проблему до VB 2015 - вот пример для IsPasswordProtected реализации:

Private ReadOnly Property ISpellingControl_IsPassWordProtected() As Boolean Implements ISpellingControl.IsPassWordProtected 
    Get 
     Return IsPassWordProtected 
    End Get 
End Property 
Public Property IsPassWordProtected() As Boolean 
    Get 
     Return isPassWordProtected_Renamed 
    End Get 
    Set(ByVal value As Boolean) 
     isPassWordProtected_Renamed = value 
    End Set 
End Property 

В «Реализации» выходит на новый ReadOnly собственности, которая называет существующие чтения/записи свойства.

+0

Спасибо Дэйв, я надеюсь, что вы не потратили слишком много времени, чтобы ответить на этот вопрос. Я буду держать это в качестве будущих ссылок. – Zer0

+0

Нет проблем - но не пугайтесь других на этом форуме. Проблема, связанная с реализацией интерфейса в VB, - это только умеренно сложная проблема преобразования C# в VB. Люди на этом форуме имеют очень мало терпимости к проблемам конверсии. –

+0

Спасибо, что сообщили мне: – Zer0

Смежные вопросы