7/24/2019 Bi Tp V Generic
1/12
Bi tp v Generic
1. Generic ClassesBi 1:namespaceGenerics_Class_Ex1{
classGen {
T ob;
publicGen(T o){ ob = o;
}
publicT getob() { returnob;
}
publicvoidshowType() {
Console.WriteLine("Tpe o! T is " tpeo!(T));
}
} classainClass {
publicstaticvoidain() {
#en i$b = ne%#en(&');
i$b.showType(); intv = i$b.getob(); Console.WriteLine("value " v);
Console.WriteLine();
#en str$b = ne%#en("#enerics add po%er.");
str$b.showType();
strin*str = str$b.getob(); Console.WriteLine("value " str); }
}
}
Bi tp Generics- GVC Ths. Nguyn Minh o Trang 1
7/24/2019 Bi Tp V Generic
2/12
Bi !:
namespaceGenerics_Class_Ex!{
classTwoGen {
T ob&;
, ob;
publicTwoGen(T o&+ , o)
{ ob& = o&;
ob = o;
}
publicvoidshowTypes() {
Console.WriteLine("Tpe o! T is " tpeo!(T));
Console.WriteLine("Tpe o! , is " tpeo!(,)); }
publicT getT() {
returnob&;
} public, get"() {
returnob;
}
}
classainClass {
publicstaticvoidain() {
T%o#en t*$b- = ne%T%o#en(&+ "");
t*$b-.showTypes();
intv = t*$b-.getT(); Console.WriteLine("value " v); strin*str = t*$b-.get"(); Console.WriteLine("value " str);
}
}}
Bi tp Generics- GVC Ths. Nguyn Minh o Trang 2
7/24/2019 Bi Tp V Generic
3/12
!. Generic #nter$aceBi 1
namespaceGenerics_#nter$aces_Ex1{
inter!aceGeneric#nter$ace {
T get"al%e(T t,alue); }
classyClass Generic#nter$ace {
publicT get"al%e(T t,alue) {
returnt,alue;
}
}
classainClass
{ staticvoidain() {
/Class int$b-ect = ne%/Class();
/Class strin*$b-ect = ne%/Class();
Console.WriteLine("{'}"+ int$b-ect.get"al%e(0)); Console.WriteLine("{'}"+ strin*$b-ect.get"al%e("1i t2ere.")); }
}
}
Bi !
namespaceGenerics_#nter$aces_Ex!{ 33 4mplement multiple *eneric inter!aces b a non5*eneric class
inter!aceGeneric#nter$ace {
T get"al%e(T in,alue); }
classyClass Generic#nter$ace+ Generic#nter$ace
Bi tp Generics- GVC Ths. Nguyn Minh o Trang
7/24/2019 Bi Tp V Generic
4/12
{
publicintget"al%e(intin,alue) { returnin,alue;
}
publicstrin*get"al%e(strin*in,alue) {
returnin,alue;
} }
classainClass {
staticvoidain() {
/ClassTriv4nt = ne%/Class(); /ClassTriv6trin* = ne%/Class();
Console.WriteLine("{'}"+ Triv4nt.get"al%e(0)); Console.WriteLine("{'}"+ Triv6trin*.get"al%e("1i t2ere."));
} }
}
Bi &
namespaceGenerics_#nter$aces_Ex&{ 33 #eneric 4nter!ace !or binar operation
publicinter!ace#Binary'perations {
T ())(T ar*&+ T ar*); T *%btract(T ar*&+ T ar*); T %ltiply(T ar*&+ T ar*); T +ivi)e(T ar*&+ T ar*); }
publicclassBasicath #Binary'perations {
publicBasicath() { }
publicint())(intar*&+ intar*)
Bi tp Generics- GVC Ths. Nguyn Minh o Trang !
7/24/2019 Bi Tp V Generic
5/12
{ returnar*& ar*; }
publicint*%btract(intar*&+ intar*) { returnar*& 5 ar*; }
publicint%ltiply(intar*&+ intar*) { returnar*& 7 ar*; }
publicint+ivi)e(intar*&+ intar*)
{ returnar*& 3 ar*; }
}
class,rogra- {
staticvoidain(strin*89 ar*s) { :asic/at2m = ne%:asic/at2();
Console.WriteLine("& & = {'}"+ m.())(&+ &)); }
}
}
Bi
33Tpe parameter T in an*le bracets.
publicclass#enericList 6stem.Collections.#eneric.4numerable
{
protectedode 2ead;
protectedode current = null;
33 ested class is also *eneric on T
protectedclassode
{
publicode net;
privateT data; 33T as private member datatpe
publicode(T t) 33T used in non5*eneric constructor
{
net = null;
data = t;
}
Bi tp Generics- GVC Ths. Nguyn Minh o Trang "
7/24/2019 Bi Tp V Generic
6/12
publicode et
{
*et{ returnnet; } set{ net = value; }
}
publicT ?ata 33T as return tpe o! propert
{
*et{ returndata; }
set{ data = value; } }
}
public#enericList() 33constructor
{
2ead = null;
}
publicvoiddd1ead(T t) 33T as met2od parameter tpe
{
ode n = ne%ode(t);
n.et = 2ead; 2ead = n;
}
33 4mplementation o! t2e iterator
public6stem.Collections.#eneric.4numerator #etnumerator()
{
ode current = 2ead;
%2ile(current @= null)
{
ieldreturncurrent.?ata;
current = current.et;
} }
33 4numerable in2erits !rom 4numerable+ t2ere!ore t2is class
33 must implement bot2 t2e *eneric and non5*eneric versions o!
33 #etnumerator. 4n most cases+ t2e non5*eneric met2od can33 simpl call t2e *eneric met2od.
6stem.Collections.4numerator 6stem.Collections.4numerable.#etnumerator()
{
return#etnumerator();
}
}
publicclass6ortedList #enericList %2ereT 6stem.4Comparable
{
33 simple+ unoptimiAed sort al*orit2m t2at
33 orders list elements !rom lo%est to 2i*2est
publicvoid:ubble6ort()
{ i!(null== 2ead BB null== 2ead.et)
Bi tp Generics- GVC Ths. Nguyn Minh o Trang #
7/24/2019 Bi Tp V Generic
7/12
{
return;
} bools%apped;
do
{
ode previous = null;
ode current = 2ead;
s%apped = !alse;
%2ile(current.net @= null)
{
33 :ecause %e need to call t2is met2od+ t2e 6ortedList
33 class is constrained on 4numerable
i!(current.?ata.CompareTo(current.net.?ata) > ')
{ ode tmp = current.net;
current.net = current.net.net;
tmp.net = current;
i!(previous == null) {
2ead = tmp;
}
else
{
previous.net = tmp;
}
previous = tmp;
s%apped = true;
}
else
{ previous = current; current = current.net;
}
}
} %2ile(s%apped); }
}
33 simple class t2at implements 4Comparable usin* itsel! as t2e
33 tpe ar*ument. T2is is a common desi*n pattern in ob-ects t2at
33 are stored in *eneric lists.
publicclasserson 6stem.4Comparable
{
strin*name;
inta*e;
publicerson(strin*s+ inti)
{
name = s; a*e = i;
Bi tp Generics- GVC Ths. Nguyn Minh o Trang $
7/24/2019 Bi Tp V Generic
8/12
}
33 T2is %ill cause list elements to be sorted on a*e values. publicintCompareTo(erson p)
{
returna*e 5 p.a*e;
}
publicoverridestrin*To6trin*()
{ returnname "" a*e;
}
33 /ust implement Duals.
publicboolDuals(erson p)
{
return(t2is.a*e == p.a*e); }
}
classro*ram
{ staticvoid/ain()
{
33?eclare and instantiate a ne% *eneric 6ortedList class.
33erson is t2e tpe ar*ument.
6ortedList list = ne%6ortedList();
33Create name and a*e values to initialiAe erson ob-ects.
strin*89 names = ne%strin*89
{
"Eranscoise"+
":ill"+
"Li"+"6andra"+"#unnar"+
"lo"+
"1iroui"+
"/aria"+"lessandro"+
"Faul"
};
int89 a*es = ne%int89 { G0+ &H+ I+ J+ &I+ H+ &'I+ K+ J'+ J0 };
33opulate t2e list.
!or(int = '; < &'; )
{
list.dd1ead(ne%erson(names89+ a*es89));
}
33rint out unsorted list.
!oreac2(erson p inlist) {
Bi tp Generics- GVC Ths. Nguyn Minh o Trang %
7/24/2019 Bi Tp V Generic
9/12
6stem.Console.WriteLine(p.To6trin*());
}
6stem.Console.WriteLine("?one %it2 unsorted list");
336ort t2e list.
list.:ubble6ort();
33rint out sorted list.
!oreac2(erson p inlist)
{ 6stem.Console.WriteLine(p.To6trin*());
}
6stem.Console.WriteLine("?one %it2 sorted list");
}
}
Generic *tac/
Bi 1namespaceGenerics_*tac/_Ex1{
classainClass {
publicstaticvoidain() {
6tac st = ne%6tac();
Bi tp Generics- GVC Ths. Nguyn Minh o Trang &
7/24/2019 Bi Tp V Generic
10/12
st.,%sh("$ne"); st.,%sh("T%o"); st.,%sh("T2ree"); st.,%sh("Eour"); st.,%sh("Eive");
%2ile(st.Count > ')
{
strin*str = st.,op(); Console.Write(str " "); }
Console.WriteLine();
}
}
}
Bi !
namespaceGenerics_*tac/_Ex!{
classy*tac/ {
intax*tac/= &';
T89 *tac/(rray; int*tac/,ointer= ';
publicy*tac/() { 6tacrra = ne%T8/a6tac9;
}
publicvoid,%sh(T ) {
i!(6tacointer < /a6tac)
6tacrra86tacointer9 = ;
}
publicT ,op() {
return(6tacointer > ')
Bi tp Generics- GVC Ths. Nguyn Minh o Trang 1'
7/24/2019 Bi Tp V Generic
11/12
6tacrra8556tacointer9
6tacrra8'9;
}
publicvoid,rint() {
!or(inti = 6tacointer 5 &; i >= '; i55)
Console.WriteLine(" ,alue {'}"+ 6tacrra8i9);
}
}
classainClass {
staticvoidain() {
/6tac 6tac4nt = ne%/6tac();
/6tac 6tac6trin* = ne%/6tac();
6tac4nt.,%sh(J); 6tac4nt.,%sh(K); 6tac4nt.,rint();
6tac6trin*.,%sh("T2is is !un"); 6tac6trin*.,%sh("1i t2ere@ "); 6tac6trin*.,rint(); }
}
}
Bi &
na(espaceGenerics_Stack_Ex3
) c*assMainClass ) pu+*icstatic,oiMainstring/0 args ) Create an use a 3tac4 o5 6sse(+*y Na(e o+7ects 3tac48MyC*ass9 stac4 : ne;3tac48MyC*ass9