Du kan sammenligne det lidt med browser - web server. En browser skal kun vide at web serveren snakker HTML 4.01 over HTTP 1.1 - den skal ikke vide om det er en IIS eller en Apache.
Hvis du laver et interface PersistData med en Save og en Load metode, så kan en applikation bruge interfacet alle steder undtagen ved instantiering og på den måde ikke vide hvordan data persisteres. Du har måske så 2 implementations class'es PersistDataDatabase og PersistDataXml og du kan skifte mellem dem udelukkende ved at ændre instantieringen.
Hvis man har delt koden op i 3 lag el. flere er det så ikke fint nok uden at have interfaces?
Jeg har fx. et par klasser, der hver især indeholder hent-opdater/indsæt data. Kunne det så tænkes at jeg havde 2 stk interfaces for hver klasse IRead, ISave ?
Har du et eksempel på lidt simpelt kode med interfaces?
Er selv meget glad for interfaces. Konstruktionen er nok noget undervuderet i den daglige programmering. Som værktøj, til at dekoble ens design og gøre det fleksibelt for fremtidige ændringer, er det sagen.
folk med Java baggrund vil formentligt have nemt ved at bruge interfaces (Java API bruger interfaces meget mere end .NET API - f.eks. består database og XML API'erne i Java stort set kun af interfaces)
ligeledes vil folk med COM baggrund nok også have meget nemt ved interfaces
VB6, Delphi og "C++ er da bare C med erklæringer hvor som helst og // kommentarer" folk skal nok vende sig lidt til konstruktionen
Giver nedenstående mening? Koden bliver kompileret fint og uden fejl. Jeg er bare ikke sikker på at jeg gør det rigtigt eller hvad?
----------------------- Kode --------------------- using System; using System.Collections; using MySql; using MySql.Data; using MySql.Data.MySqlClient; using wwwbutikdk.businessLogicLayer;
/// <summary> /// Summary description for Product. /// </summary> public class ProductDALC : IStorable { // Constuctor public ProductDALC() { }
public ArrayList GetProductSearchLst(string SoegStreng) { string SQL = "SELECT product.id AS product_id, product.name AS product_name, product.price AS product_price, photo.id as photo_id, photo.photo_data FROM product INNER JOIN photo ON (product.photo_id = photo.id) WHERE (NAME LIKE '%"+ SoegStreng +"%')ORDER BY NAME;";
DbConnector dbCon = new DbConnector(); MySqlDataReader rdr = dbCon.DbConnect(SQL);
ArrayList arrLstProduct = new ArrayList();
while (rdr.Read()) { ProductEntity p = new ProductEntity(); p.ProductId = (int) rdr["product_id"]; p.ProductName = (string) rdr["product_name"]; p.ProductPrice = Convert.ToDecimal(rdr["product_price"]); p.ProductPhotoId = (int) rdr["photo_id"]; arrLstProduct.Add(p); } dbCon.DbClose(); return arrLstProduct; }
public ArrayList GetProduct(int ProductId) {
string SQL = "SELECT product.id AS product_id, product.name AS product_name, product.price AS product_price, photo.id as photo_id, product.description as product_description FROM product INNER JOIN photo ON (product.photo_id = photo.id) WHERE product.id = "+ ProductId + ""; DbConnector dbCon = new DbConnector(); MySqlDataReader rdr = dbCon.DbConnect(SQL);
ArrayList arrLstProduct = new ArrayList();
if (rdr.Read()) { ProductEntity p = new ProductEntity(); p.ProductId = (int) rdr["product_id"]; p.ProductName = (string) rdr["product_name"]; p.ProductPrice = Convert.ToDecimal(rdr["product_price"]); p.ProductPhotoId = (int) rdr["photo_id"]; p.ProductDescription = (string) rdr["product_description"]; arrLstProduct.Add(p); }
------ implementation -------------- public void SaveProduct(){
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.SaveProduct(p);
public class ProductDALC : IProduct { string SoegStreng; int ProductId; ProductEntity p;
// Constuctor public ProductDALC() { }
public ArrayList GetProductSearchLst(string SoegStreng) { this.SoegStreng = SoegStreng;
string SQL = "SELECT product.id AS product_id, product.name AS product_name, product.price AS product_price, photo.id as photo_id, photo.photo_data FROM product INNER JOIN photo ON (product.photo_id = photo.id) WHERE (NAME LIKE '%"+ SoegStreng +"%')ORDER BY NAME;";
DbConnector dbCon = new DbConnector(); MySqlDataReader rdr = dbCon.DbConnect(SQL);
ArrayList arrLstProduct = new ArrayList();
while (rdr.Read()) { ProductEntity p = new ProductEntity(); p.ProductId = (int) rdr["product_id"]; p.ProductName = (string) rdr["product_name"]; p.ProductPrice = Convert.ToDecimal(rdr["product_price"]); p.ProductPhotoId = (int) rdr["photo_id"]; arrLstProduct.Add(p); } dbCon.DbClose(); return arrLstProduct; }
public ArrayList GetProduct(int ProductId) { this.ProductId = ProductId;
string SQL = "SELECT product.id AS product_id, product.name AS product_name, product.price AS product_price, photo.id as photo_id, product.description as product_description FROM product INNER JOIN photo ON (product.photo_id = photo.id) WHERE product.id = "+ ProductId + ""; DbConnector dbCon = new DbConnector(); MySqlDataReader rdr = dbCon.DbConnect(SQL);
ArrayList arrLstProduct = new ArrayList();
if (rdr.Read()) { ProductEntity p = new ProductEntity(); p.ProductId = (int) rdr["product_id"]; p.ProductName = (string) rdr["product_name"]; p.ProductPrice = Convert.ToDecimal(rdr["product_price"]); p.ProductPhotoId = (int) rdr["photo_id"]; p.ProductDescription = (string) rdr["product_description"]; arrLstProduct.Add(p); }
Men jeg får 3 fejl...der siger.... Fejl 1: \productdalc.cs(21): 'wwwbutikdk.dataAccessLayer.ProductDALC' does not implement interface member 'wwwbutikdk.dataAccessLayer.IProduct.GetProduct(int)'. 'wwwbutikdk.dataAccessLayer.ProductDALC.GetProduct(int)' is either static, not public, or has the wrong return type.
Jeg tror jeg denne gang gør brug af interface....men det fejler, hvad overser jeg? Kan du hjælpe?
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);
Interface metoder er implicit public, da de skal bruges af andre klasser.
Meningen med det du har lavet er, at du kunne tænke dig, engang i fremtiden, at implementere de tre interface metoder på en anden måde, end du har gjort her. Som i arne v's eksempel 07/05-2005 22:19:02. Prøv at kikke på din driverkode. I arne v's eksempel er det: //IProductDAL NewProduct = new ProductDALDatabase(); IProductDAL NewProduct = new ProductDALXml(); NewProduct.SaveProduct(p);
Som det ser ud nu, har du ikke brug for et interface, dvs. at lave den samme ting på forskellige måder. Kan du tænke dig at implementere de tre metoder i interfacet på en anden måde? Hvis ikke, skal du ikke bruge et interface.
Synes godt om
Ny brugerNybegynder
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.