2017-09-12 1 views
0

J'ai une classe qui devrait faire différentes choses avec un formulaire.Un cas pour l'interface?

Parce que ces « choses » sont spécifiques à la forme, je stocke la référence à la forme comme ceci:

Friend Class clsEdit 

    Private m_Form As frmMain 

Et je passe à la classe comme ceci:

Public Sub New(ByRef uForm As frmMain) 

    m_Form = uForm 

End Sub 

maintenant quand ma classe doit faire ces « choses », je le fais comme ceci:

MyEditClass.DoThings() 

en interne, il ressemble à ceci:

Public Sub DoThis() 

    m_Form.SetHookPaused(True) 
    m_Form.StopCommonTimers() 

End Sub 

Protected Overrides Sub Finalize() 
    m_Form.DoSomethingThatOnlyThisFormCanDo() 
End Sub 

Je voudrais maintenant pouvoir utiliser clsEdit sur une autre forme. Cette autre forme a aussi les fonctions "DoThings" et "DoSomethingThatOnlyThisFormCanDo".

Cependant, quand je change la déclaration de m_Form à cette

Private m_Form As Form 

... Je ne peux plus:

m_Form.DoThings() 

... parce que "DoThings" est pas un propriété/fonction de "formulaire".

Et quand je change à ceci:

Private m_Form As frmOther 

... Je ne peux pas faire plus:

Public Sub New(ByRef uForm As frmMain) 

    m_Form = uForm 

End Sub 

Quelqu'un peut-il me dire comment je pourrais le faire?

+0

Un formulaire est déjà une classe. Vous pouvez simplement ajouter des méthodes au formulaire plutôt que de le ranger dans une autre classe. Vous ne savez pas comment Interfaces joue dans votre message. – Plutonix

+1

Oui, si vous avez deux formulaires différents avec les mêmes méthodes et fonctions, créez une interface et utilisez-la à la place. – LarsTech

+0

Voulez-vous me donner un kickstart sur une interface pour ce cas? – tmighty

Répondre

3

Créer votre interface:

Public Interface IFormStuff 
    Sub SetHookPaused(value As Boolean) 
    Sub StopCommonTimers() 
End Interface 

Remplacer la forme variable avec la variable d'interface dans la classe:

Public Class clsEdit 
    Private m_Form As IFormStuff 

    Public Sub New(f As IFormStuff) 
    m_Form = f 
    End Sub 

    Public Sub DoThis() 
    m_Form.SetHookPaused(True) 
    m_Form.StopCommonTimers() 
    End Sub 
End Class 

implémentent l'interface dans chaque forme:

Public Class Form1 
    Implements IFormStuff 

et chaque formulaire doit implémenter ces stubs d'interface:

Public Sub SetHookPaused(value As Boolean) Implements IFormStuff.SetHookPaused 
    ' do something 
End Sub 

Public Sub StopCommonTimers() Implements IFormStuff.StopCommonTimers 
    ' do something 
End Sub 

alors vous devez créer la classe au niveau de la forme:

Voilà l'essentiel.