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 ModuleForm1
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 Subformi 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 Classformi 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 ClassLoistavaa! Vihdoin tajusin, mikä rajapinta on. Kiitos!
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ä :] )
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).
peki, juuh kiitos tiedosta :)
täytyy alkaa näköjään tienaamaan rahaa...
vois kyl ruveta miljonääriksi...
Standardiveriso ei tee esim dll:iä mutta asian voi kiertää
https://www.ohjelmointiputka.net/koodivinkit/
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.