Generini tipi Izpiimo tabelo celih tevil decimalnih tevil
Generični tipi
Izpišimo tabelo celih števil, decimalnih števil in tabelo znakov public static void izpisi. Tabelo(int[] tabela) { for (int i = 0; i < tabela. Length; i++) Console. Write(tabela[i] + " "); Console. Write. Line(); } public static void izpisi. Tabelo(double[] tabela) { for (int i = 0; i < tabela. Length; i++) Console. Write(tabela[i] + " "); Console. Write. Line(); } public static void izpisi. Tabelo(char[] tabela) { for (int i = 0; i < tabela. Length; i++) Console. Write(tabela[i] + " "); Console. Write. Line(); } Preobteževanje Za VSAK tip rabimo svojo metodo, čeprav so vse praktično enake! public static void Main(string[] args) { int[] int. Tab = { 1, 2, 3, 4, 5 }; double[] double. Tab = { 1. 1, 2. 2, 3. 3, 4. 4, 5. 5, 6. 6, 7. 7 }; char[] char. Tab = { 'H', 'E', 'L', 'O' }; Console. Write. Line("Tabela int. Tab vsebuje: "); izpisi. Tabelo(int. Tab); // izpis tabele intov Console. Write. Line("Tabela double. Tab vsebuje: "); izpisi. Tabelo(double. Tab); // // izpis tabele Double Console. Write. Line("Tabela char. Tab vsebuje: "); izpisi. Tabelo(char. Tab); // izpis tabele Character } Matija Lokar, FMF
Generični tipi • C# podpira tako imenovane generične tipe • Če ob imenu metode uporabimo <T> (namesto T seveda lahko piše karkoli!), povemo, da naj prevajalnik sam ugotovi, kaj ob dejanskem klicu pomeni T. In ta tip T lahko uporabljamo kot vse ostale.
Izpišimo tabelo celih števil, decimalnih števil in tabelo znakov - novi način z generičnimi tipi public static void izpisi. Tabelo<T>(T[] tabela) { for (int i = 0; i < tabela. Length; i++) Console. Write(tabela[i] + " "); Console. Write. Line(); } public static void Main(string[] args) { int[] int. Tab = { 1, 2, 3, 4, 5 }; double[] double. Tab = { 1. 1, 2. 2, 3. 3, 4. 4, 5. 5, 6. 6, 7. 7 }; char[] char. Tab = { 'H', 'E', 'L', 'O' }; Console. Write. Line("Tabela int. Tab vsebuje: "); izpisi. Tabelo(int. Tab); // izpis tabele intov Console. Write. Line("Tabela double. Tab vsebuje: "); izpisi. Tabelo(double. Tab); // // izpis tabele Double Console. Write. Line("Tabela char. Tab vsebuje: "); izpisi. Tabelo(char. Tab); // izpis tabele Character } Matija Lokar, FMF
Ali tabela vsebuje podatek public static bool Ali. Vsebuje<T>(T[] array, T element) { foreach (T e in array) { if (e. Equals(element)) { return true; } } return false; } • Uporaba zanke foreach [znamo tudi z običajno] • Vsak razred vsebuje metodo Equals (kot tudi metodo To. String)
In seveda so generični tipi na voljo tudi v razredih • Razred, ki hrani podatke določenega tipa • Moj. R<int> a = new Moj. R<int>(12); • Moj. R<Pravokotnik> n. P = new Moj. R<Pravokotnik>(nek. Prav); • Moj. R<string> m. S = new Moj. R<string>("42");
Moj. R public class Moj. R<T> { private T obj; public Moj. R(T pod) { this. obj = pod; } public T Podatek { get{return this. obj; } set{this. obj = value; } } public override string To. String() { return this. Podatek. To. String(); } }
Test Pravokotnik b = new Pravokotnik(6, 3); Moj. R<int> a = new Moj. R<int>(12); Moj. R<Pravokotnik> n. P = new Moj. R<Pravokotnik>(b); Moj. R<string> m. S = new Moj. R<string>("42"); Console. Write. Line(a. Podatek); Console. Write. Line(n. P); Console. Write. Line(m. S);
Izpiši večji podatek med dvema • Glava metode: – public static void Izpis<T>(T pod 1, T pod 2) • Klic: – Izpis(12, 5) • T je ob tem klicu int – Izpis("bla", "ble") • T je string – Izpis(new Ulomek(3, 5), ul 2) • T je Ulomek
A v praksi
Omejitve • Gre pa z: public static void Izpis<T>(T p 1, T p 2) where T : IComparable<T> { if (p 1. Compare. To(p 2) > 0) Console. Write. Line(p 1); else Console. Write. Line(p 2); } • • Postavili smo omejitev: T mora biti tak tip, ki implementira vmesnik IComparable, kar pomeni, da v njem obstaja metoda Compare. To In ker vse "navadne" tipe (int, string, … ) lahko primerjamo tudi na ta način … Izpis(12, 5); Izpis("bla", "blo"); Pravokotnik a = new Pravokotnik(4, 5); Pravokotnik b = new Pravokotnik(6, 3); Izpis(a, b);
Vrni večjega public static T Izpis<T>(T p 1, T p 2) where T : IComparable<T> { if (p 1. Compare. To(p 2) > 0) return p 1; return p 2; }
In kako je z vmesniki? • In kaj to sploh so … • Malo kasneje …
- Slides: 13