Kirjautuminen

Haku

Tehtävät

Koodit: VB.NET: Rajapinnat

Kirjoittaja: tnb

Kirjoitettu: 21.04.2004 – 21.04.2004

Tagit: koodi näytille, vinkki

Rajapintaohjelmointi on menetelmä, jolla voidaan sovittaa yhteen luokka ja sitä käyttävä koodi, vaikka nillä olisikin käytössä eri muuttuja ja funktio nimet.

Rajapinta vastaa ongelmaan: "Sain kaverilta formin joka tekee homman paremmin kuin oma formini, mutta kaverilla on käytössä toiset funktionimet kuin itselläni ja yhteensovittaminen veisi koko illan".

Rajapinta vastaa myös ongelmaan: "Tein paremman formin kuin kumpikaan kaverini ja he haluaisivat että sovittaisin formini heidän funktionimille. Heillä vaan on käytössä eri nimet ja kahden koodin tekeminen veisi koko illan". Luokka (siis formi) voi siis toteuttaa yhtäaikaa useaa rajapintaa.

Rajapintaa käytettäessä (Form1 koodi) tulee myös rajapinnasta tehdä instanssi(Dim Rajapinta As IFunktio) ja kertoa sille mikä formi on rajapinnan instanssin takana (Rajapinta = formi).

Demossa on:
moduli1 jossa rajapinnan määrittely
form1 jossa painike "Piirrä"
formit PiirraKuvaaja1 ja PiirraKuvaaja2
Demo piirtää parabolin tai sini käyrän sen mukaa kumpaa formia käytetään. Formin vaihto ei aiheuta uudelleen koodausta, vaikka formeissa on eri sisäinen funktionimi piirrolle.

Moduliin

Module RajapintaModuli
    'rajapintamäärittely, jota luokat voivat käyttää
    'peittääkseen sisäiset funktionsa
    Public Interface IFunktio
        Function Piirrä() As Double
    End Interface
    Public Interface IFunktioB ' toinen rajapinta
        Function Tulosta() As Double
    End Interface
End Module

Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim formi As New PiirraKuvaaja1 ' tehdään instanssi formista "x^2"
        'Dim formi As New PiirraKuvaaja2 ' tehdään instanssi formista "sini"
        Dim Rajapinta As IFunktio ' tehdään instanssi rajapinnasta
        Rajapinta = formi ' liitetään rajapinnan taakse formi
        Rajapinta.Piirrä()
        'rajapintaa käyttävä koodi on riippumatonta siitä,
        'kumpaa formia käytetään
        'ja riippumaton myös formien sisäisistä nimistä
    End Sub

formi PiirraKuvaaja1

Public Class PiirraKuvaaja1
    Inherits System.Windows.Forms.Form
    Implements IFunktio 'käyttää rajapintaa IFunktio
    Implements IFunktioB

'..... vakio koodi poistettu

    Dim g As Graphics
    Dim mustaKynä
    Private Sub PiirraKuvaaja1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        g = Me.CreateGraphics
        mustaKynä = New Pen(Color.Black)
    End Sub
    Private Function PiirraParaboli() As Double Implements IFunktio.Piirrä, IfunktioB.Tulosta 'rajapinnan Piirrä funktio korvautuukin tällä
        Me.Show()
        g.DrawLine(mustaKynä, 10, 110, 210, 110) 'x akseli
        g.DrawLine(mustaKynä, 10, 10, 10, 210) 'y akseli
        Dim i As Integer
        Dim x1, x2, y1, y2 As Double
        For i = 0 To 199
            x1 = CDbl(i) / 100
            x2 = CDbl(i + 1) / 100
            y1 = LaskeParaboli(x1)
            y2 = LaskeParaboli(x2)
            g.DrawLine(mustaKynä, i + 10, CInt(-100 * y1 + 110), (i + 1) + 10, CInt(-100 * y2 + 110))
        Next
    End Function
    Private Function LaskeParaboli(ByVal x As Double) As Double
        Return (x - 1) * (x - 1) - 0.5
    End Function

End Class

formi PiirraKuvaaja2

Public Class PiirraKuvaaja2
    Inherits System.Windows.Forms.Form
    Implements IFunktio ' käyttää rajapintaa IFunktio
    Implements IFunktioB

' .... vakio koodi poistettu

    Dim g As Graphics
    Dim punaKynä
    Private Sub PiirraKuvaaja2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        g = Me.CreateGraphics
        punaKynä = New Pen(Color.Red)
    End Sub
    Private Function PiirraSini() As Double Implements IFunktio.Piirrä, IFunktioB.Tulosta ' tämä korvaa rajapinnan Pirrä funktion
        Me.Show()
        g.DrawLine(punaKynä, 10, 110, 210, 110) 'x akseli
        g.DrawLine(punaKynä, 10, 10, 10, 210) 'y akseli
        Dim i As Integer
        Dim x1, x2, y1, y2 As Double
        For i = 0 To 199
            x1 = CDbl(i) / 100
            x2 = CDbl(i + 1) / 100
            y1 = LaskeSini(x1)
            y2 = LaskeSini(x2)
            g.DrawLine(punaKynä, i + 10, CInt(-100 * y1 + 110), (i + 1) + 10, CInt(-100 * y2 + 110))
        Next
    End Function
    Private Function LaskeSini(ByVal x As Double) As Double
        Return Math.Sin(x * Math.PI)
    End Function

End Class

Kommentit

peki [21.04.2004 08:32:57]

#

Loistavaa! Vihdoin tajusin, mikä rajapinta on. Kiitos!

nomic [21.04.2004 22:48:26]

#

juuh, tää näyttää mukavalta koodilta ja hyvä aihevalinta, siitä plussaa, ainut miinus omalla kohdallani on että tämä on tehty .net versioon, sitä alkaa jo vakavasti harkitsemaan .net version hankkimista, paljon muutes .net maksaisi? <---ihan näin offtopickina melkein (hipoo aihetta koska käsittelee .net:iä :] )

peki [22.04.2004 15:20:58]

#

Riippuu lisenssistä. Älä missään nimessä osta standardversiota. Siinä ei ole edes optimointi mahdollisuutta(eikä paljon muitakaan herkkuja). Suosittelen Professonalia tai Enterpriseä, vaikka kalliita ovatkin.
Nehän sitten sisältävät kielet vb.net, c++, c#, j#, sekä setupohjelman teko-ohjelman. Lisäksi mahdollisuus yhdistellä näitä kaikkia kieliä helposti(c++ + vb.net = taivas).

nomic [22.04.2004 16:45:48]

#

peki, juuh kiitos tiedosta :)
täytyy alkaa näköjään tienaamaan rahaa...
vois kyl ruveta miljonääriksi...

tnb [23.04.2004 20:58:52]

#

Standardiveriso ei tee esim dll:iä mutta asian voi kiertää
https://www.ohjelmointiputka.net/koodivinkit/24199-vb-net-dll-teko-vb-net-standard-versio

Hellami [24.10.2004 16:11:31]

#

On myös yksi ilmainen vaihtoehto, en kyllä tiedä tuosta sen paremmin, kun juuri itse latailen kyseistä ohjelmaa:
http://www.icsharpcode.net/OpenSource/SD/

EDIT: Näyttäisi näin yhtäkkiä olevan lähes suora kopio itse maksullisesta m$:n tuotteesta.

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta