Avatar billede decrypto Nybegynder
08. maj 2005 - 10:46 Der er 18 kommentarer og
1 løsning

Interface i c# (fortsat)

Okay, jeg tror, at jeg har det meste på plads mht. interfaces i c#.

Da navnet er interface, så er det jo rigtigt at forstå, at al kommunikation med en klasse sker igennem et interface.

namespace EtEllerAndet{

interface IProduct{
    void Save(ProductEntity p);
}


public class ProductDALC : IProduct{
    string SoegStreng;
    int ProductId;
    ProductEntity p;

    // Constuctor
    public ProductDALC()
    {
    }

    public void Save(ProductEntity p)
    {
    this.p = p;

    string SQL = "....";
    DbConnector dbCon = new DbConnector();
    dbCon.DbConnect(SQL);
    dbCon.DbClose();
    }

}



----- Brug --------

ProductEntity p = new ProductEntity();
p.ProductPhotoId = 2;
p.SupplierId = 1;
p.ProductName = "New fasil";
p.ProductPrice = 299;
p.ProductDescription = "A little description";

ProductDALC NewProduct = new ProductDALC();
NewProduct.Save(p); // Bruger interfacet og går derfra ned i save metoden "class ProductDALC" klassen er det korrekt?
Avatar billede arne_v Ekspert
08. maj 2005 - 10:48 #1
Da et interface ikke indeholder kode, så kan du ikke sige at du kalder koden.
Avatar billede arne_v Ekspert
08. maj 2005 - 10:49 #2
IProduct NewProduct = new ProductDALC(); // NewProduct peger på et objekt som oberholde IProduct kontraktem om at have en Save metode
                                        // initialiser med et objekt som opfuylder kontrakten
NewProduct.Save(p); // kald Save da du ved at uanset hvilken klasse NewProject peger på så overholder den IProduct kontrakten
Avatar billede arne_v Ekspert
08. maj 2005 - 10:50 #3
(hm - den formatering ser dæleme ikke godt ud - men du kan nok regne det ud)
Avatar billede decrypto Nybegynder
08. maj 2005 - 12:34 #4
Ok...jeg prøver mig lige frem....
Avatar billede decrypto Nybegynder
08. maj 2005 - 12:51 #5
Glædelig nyhed...det er begyndt at klare op i mit forvirrede sind.

Dvs et interface er det jeg kommunikerer med udefra, og rent klasse mæssigt kan jeg have fx. to save metoder. Det eneste der adskiller om hvilken metode i en klasse jeg benytter, er når jeg laver en instans af en klasse.

interface IMitInterface{
  void Save(xx xxx);
  void Load(xx xxx);
}

public class1 : IMitInterface{

Save(xx xxx){
  ...............
}
Load(xx xxx){
  ...............
}
}

public class2 : IMitInterface{
Save(xx xxx){
  ...............
}
Load(xx xxx){
  ...............
}
}


------- Brug ---------

// Her bruger jeg class1
IMitInterface o = new class1 // Her bruger jeg interface til at fortælle at jeg kan benytte de 2 metoder save og load som ligger i class1
o.Save(xx xxx);
o.Load(xx xxx);

// Her bruger jeg class2
IMitInterface o = new class2 // Her bruger jeg interface til at fortælle at jeg kan
benytte de 2 metoder save og load som ligger i class2
o.Save(xx xxx);
o.Load(xx xxx);

Giv mig ret hvis det er korrekt...
Avatar billede arne_v Ekspert
08. maj 2005 - 12:53 #6
Helt korrekt
Avatar billede arne_v Ekspert
08. maj 2005 - 12:57 #7
det er ligesom en postkasse - uanset hvor du er i verden, så sætter du
et frimærke på et brev og smider det i en postkasse - du kender kun interfacet, men
uanset om det er Post Danmark eller langtbortistans postvæsen der ligger
bagved så når brevet frem
Avatar billede decrypto Nybegynder
08. maj 2005 - 13:13 #8
Er der måder man kan sikre, at man tvungent skal gå igenem et interface? For man kan jo hurtigt komme til at lave en instans af fx class1 (class1 o = new class1) uden at indikation af interface, og så direkte gøre brug af metoden o.save fx.
Avatar billede decrypto Nybegynder
08. maj 2005 - 13:16 #9
Og en anden ting...et interface skal vel altid afspejle de antal metoder for en klasse man 'lægger' et interface over.

Fx hvis en klasse indeholder 4 metoder, så SKAL interfacet også indeholde 4 metoder, da det jo er hele klassen, man lægger interfacet over.
Avatar billede arne_v Ekspert
08. maj 2005 - 14:09 #10
en klasse kan implementere 3 interfaces med henholdsvis 2, 3 og 4 metoder og selv have 17 metoder
Avatar billede arne_v Ekspert
08. maj 2005 - 14:11 #11
Det er ikke normalt at man tvinger brug af interfaces.

Det er mere "god skik og brug".

I et vist omfang kan man dog styre det ved at lave klasser som returnerer
interfaces.
Avatar billede arne_v Ekspert
08. maj 2005 - 14:11 #12
Se f.eks. dette eksempel:

using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.OleDb;
using System.Data.Odbc;

public class MultiDb
{
    public static IDbConnection GetConnection(string constr)
    {
        if(constr.ToUpper().IndexOf("DRIVER=") >= 0)
        {
            return new OdbcConnection(constr);         
        }
        else if(constr.ToUpper().IndexOf("PROVIDER=") >= 0)
        {
            return new OleDbConnection(constr);       
        }
        else if(constr.ToUpper().IndexOf("TRUSTED_CONNECTION=") >= 0 ||
                constr.ToUpper().IndexOf("INTEGRATED SECURITY=") >= 0)
        {
            return new SqlConnection(constr);         
        }
        else
        {
            return null;
        }
    }
}
class TestClass
{
    private static void test(string constr)
    {
        IDbConnection con = MultiDb.GetConnection(constr);
        con.Open();
        IDbCommand cmd = con.CreateCommand();
        cmd.CommandText = "SELECT * FROM T1";
        IDataReader rdr = cmd.ExecuteReader();
        while(rdr.Read()) {
            int f1 = (int)rdr[0];
            string f2 = (string)rdr[1];
            Console.WriteLine(f1 + " " + f2);
        }
        con.Close();
    }
    public static void Main(string[] args)
    {
        test("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\Database\\MSAccess\\Test.mdb");
        test("server=ARNEPC2;Integrated Security=SSPI;database=Test");
    }
}
Avatar billede jimgordon Nybegynder
09. maj 2005 - 13:58 #13
Arne_v 14:31 >>
1.
"I et vist omfang kan man dog styre det ved at lave klasser som returnerer interfaces.".
Er det ikke metoderne i klassen MultiDb der returnerer interfaces istedet ?
2.
I "public static IDbConnection GetConnection(string constr)" er IDbConnection et interface. Hvordan ser det interface ud ?
Avatar billede arne_v Ekspert
09. maj 2005 - 14:02 #14
re 1) klasser med metoder som returnerer interface

re 2) det er et interface som er en del af .NET - slå System.Data.IDbConnection
      op i docs
Avatar billede segato Nybegynder
09. maj 2005 - 22:37 #15
Du kan også gøre en base klasse abstract. Det vil give samme funktionalitet men kan kan også tilføje andet funktionalitet.
Avatar billede decrypto Nybegynder
10. maj 2005 - 13:58 #16
Så er jeg tilbage. Tak for alle vinkler og opklaringer. Det jeg synes er sjovt, er at den bog jeg har siddet og læst om interfaces i c# på intet tidspunkt har lavet en instans af en klasse som fx i mit tilfælde:

IProductDALC NewProduct = new ProductDALC();
NewProduct.SaveProduct(p);

Men istedet for...

ProductDALC NewProduct = new ProductDALC();
NewProduct.SaveProduct(p);

Jeg ved ikke om det er en fejl i bogen, eller om det er underforstået... bogen går dog videre med at fortælle at man kan caste til et interface, men intet sted i bogen er måden: IProductDALC NewProduct = new ProductDALC(); blevet vist som eksempel. Jeg gætter at man catser instansierer alt på på denne linje, det virker jo også uden fejl.
Avatar billede arne_v Ekspert
10. maj 2005 - 15:30 #17
Det er ikke nødvendigt at caste i den situation. Kun hvis det er den anden vej.

Umiddelbart vil jeg mene at det er en meget brugt konstruktion. Fordelen ved
den konstruktion er at man får compiler fejl, hvis man forsøget at kalde
NewProduct.xxxx hvor xxxx kun er i ProductDALC men ikke i IProductDALC. Og det er jo
skidt fordi så har man bundet sig til en bestemt implementation.
Avatar billede decrypto Nybegynder
11. maj 2005 - 10:35 #18
Der er naturligvis point...send bare et svar ind. :o)
Avatar billede arne_v Ekspert
11. maj 2005 - 10:45 #19
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester