C# ja oliot. Santtu Viitanen Niko Mononen Jyri Leinonen

Samankaltaiset tiedostot
Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

.NET ajoympäristö. Juha Järvensivu 2007

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

Rajapinta (interface)

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

C# olio-ohjelmointi perusopas

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

Olio-ohjelmointi Javalla

9. Periytyminen Javassa 9.1

C# ja.net. Juha Järvensivu 2007

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Metodien tekeminen Javalla

9. Periytyminen Javassa 9.1

7. Oliot ja viitteet 7.1

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Luokat ja oliot. Ville Sundberg

1. Omat operaatiot 1.1

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();

7. Näytölle tulostaminen 7.1

8. Näppäimistöltä lukeminen 8.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Ohjelmoinnin jatkokurssi, kurssikoe

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Pakkaukset ja määreet

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Mikä yhteyssuhde on?

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

4. Luokan testaus ja käyttö olion kautta 4.1

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

8. Näppäimistöltä lukeminen 8.1

Sisällys. 9. Periytyminen Javassa. Periytymismekanismi Java-kielessä. Periytymismekanismi Java-kielessä

Tehtävä 1. Tehtävä 2. Arvosteluperusteet Koherentti selitys Koherentti esimerkki

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Periytyminen (inheritance)

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

19. Olio-ohjelmointia Javalla 19.1

Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Java-kielen perusteet

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Java kahdessa tunnissa. Jyry Suvilehto

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Listarakenne (ArrayList-luokka)

1. Mitä tehdään ensiksi?

T Henkilökohtainen harjoitus: FASTAXON

Javan perusteita. Janne Käki

Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen

14. Poikkeukset 14.1

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Luokan sisällä on lista

Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus

JAVA-OHJELMOINTI 3 op A274615

1. Olio-ohjelmointi 1.1

Pakkauksen kokoaminen

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Lista luokan sisällä

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

1 Tehtävän kuvaus ja analysointi

Web Services tietokantaohjelmoinnin perusteet

Tietokannat II -kurssin harjoitustyö

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. II Johdanto olio-ohjelmointiin

Olio-ohjelmointi Virhetilanteiden käsittely

KOHDELUOKAN MÄÄRITTELY

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Oliot viestivät metodeja kutsuen

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

15. Ohjelmoinnin tekniikkaa 15.1

Common Language Runtime

Ohjelmointikieli TIE Principles of Programming Languages Syksy 2017 Ryhmä 19

812347A Olio-ohjelmointi, X Reflektiivisyys

ITKP102 Ohjelmointi 1 (6 op)

T Olio-ohjelmointi Osa 5: Periytyminen ja polymorfismi Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

Ohjelmointi 1 / 2009 syksy Tentti / 18.12

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

5. HelloWorld-ohjelma 5.1

Aalto Yliopisto T Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Tietorakenteet. JAVA-OHJELMOINTI Osa 5: Tietorakenteita. Sisällys. Merkkijonot (String) Luokka String. Metodeja (public)

7/20: Paketti kasassa ensimmäistä kertaa

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

15. Ohjelmoinnin tekniikkaa 15.1

Delegaatit ja tapahtumakäsittelijät

Ohjelmointi 2 / 2010 Välikoe / 26.3

Olio-ohjelmoinnissa luokat voidaan järjestää siten, että ne pystyvät jakamaan yhteisiä tietoja ja aliohjelmia.

Vertailulauseet. Ehtolausekkeet. Vertailulauseet. Vertailulauseet. if-lauseke. if-lauseke. Javan perusteet 2004

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

815338A Ohjelmointikielten periaatteet

C++11 Syntaksi. Jari-Pekka Voutilainen Jari-Pekka Voutilainen: C++11 Syntaksi

Graafisen käyttöliittymän ohjelmointi

YHTEYSSUHDE (assosiation)

14. Poikkeukset 14.1

Transkriptio:

C# ja oliot Santtu Viitanen Niko Mononen Jyri Leinonen

1. Alustus C#:sta - Microsoftin kehittämä yleiskäyttöinen olio-ohjelmointikieli - Pääsuunnittelijana toimi Andreas Hejlsberg, joka on aiemmin osallistunut Turbo Pascalin, Embacadero Delphin ja Visual J++: n suunnitteluun - Lähtökohtana oli luoda yksinkertainen ja moderni oliokieli, jolla on C-kielen syntaksi. Tavoitteena oli myös yhdistetää C++: n ja Turbo Pascalin tehokkuus sekä Javan ja Visual Basicin helppous - Suunnittelu alkoi tammikuussa 1999 ja esiteltiin ensimmäististä kertaa heinäkuussa 2000

- Kielen ensimmäinen versio (1.0) julkaistiin Tammikuussa 2002 ja toinen versio (2.0) syyskuussa 2005. - Nämä molemmat versiot ovat ECMA ja ISO/IEC standarsoituja. Kielestä on myös julkaistu 3.0 versio elokuussa 2007 sekä 4.0 huhtikuussa 2010, mutta näitä uudempia versioita ei ole vielä standarsoitu. Kielen 5.0 versio on suunnitteilla.

1.2 Arkkitehtuuri - Common Language Infrastructure (CLI) on avoin Microsoftin kehittämä määritelmä. Tämä määritelmä kuvaa ympäristön jossa voidaan käyttää useampaa korkean tason kieltä erilaisilla tietokoneilla ilman tarvetta kirjottaa koodia uudelleen eri alustoille. Common Language Runtime (CLR) on Microsoftin oma CLI:n toteuttava järjestelmä. Myös vapaat ja avoimen lähdekoodin Mono ja Portable.NET toteuttavat CLI:n.

-.NET Framework on Microsoftin kehittämä sovellus framework joka toimii Windows ympäristöissä. Se pitää sisällään Class Libaryn sekä Common Language Runtimen. Class Libary sisältää suuren määrän valmista koodia yleisimpiin koodaus ongelmiin. Se tarjoaa apua esimerkiksi käyttöliittymiin, tietokantayhteyksiin, salauksiin, tietoverkkoliikenteeseen sekä moneen muuhun. Class Libary pitää sisällään myös monia muita kirjastoja kuten esimerkiksi Windows Forms, ASP.NET, ADO.NET ja WPF (Windows Presentation Foundation)..NET framework mahdollistaa monen kielen käytön ja kaikki sen kirjastot ovat kaikkien sen tukemien kielten käytettävissä.

- Common Language Runtime mahdollistaa seuraavan käytännön toiminnan: Kehittäjä kirjoittaa koodin valitsemallaan CLI yhteensopivalla kielellä (esim C#, VB.NET, C++). Käännön aikana kääntäjä kääntää käytetyn kielen Common Intermediate Language:ksi (CIL). Ajon aikana laitteen oma Common Language Runtime kääntää CIL koodin konekieleksi joka voidaan suorittaa kyseisellä alustalla. CLR tarjoaa myös tärkeitä palveluita kuten muistin hallinnan, säikeiden hallinnan, poikkeusten hallinnan, roskien keruun sekä tietoturvan. CLR siis mahdollistaa usean erillaisen kielen käytön usealla erillaisella alustalla ilman, että koodia tarvitsisi kirjoittaa uudestaan tai kääntää jokaiselle alustalle oma versio sovelluksesta. Tällöin myöskään kehittäjän ei tarvitse kiinnittää huomiota alustojen erillaisuuteen.

Mono projektin tarkoituksena on luoda vapaa ja avoimen lähdekoodin vastine.net Frameworkista. Mono projekti mahdollistaa.net sovelluksien ajamisen useammalla eri käyttöjärjestelmällä. Tämä on hyödyllistä esimerkiksi pelikehityksessä sillä sama koodi pyörii Windows, Mac OS X, Linux, PlayStation 3, Wii ja Xbox 360 ympäristöissä. Tällä hetkellä Mono tarjoaa.net:n core API:n sekä tuen VB.NET:lle ja C#:n versioille 2.0, 3.0 ja 4.0. Se myös tukee Windows Forms 2.0. Mono sisältää myös avoimen lähdekoodin version Silverlightista. Mono tarjoaa myös C# kääntäjän sekä CLR:n toiminnalisuuden. Projektin päämääränä on tukea lähes täysin. NET 4.0:n ominaisuuksia.

2. C# kielen perusrakenteet Arvotyypit sisältävät suoraan arvonsa ja ne varaavat muistinsa pinosta. int luku1 = 123; Viittaustyypit varaavat muistinsa keosta ja pino sisältää vain viittauksen keon muistiosoitteeseen. Eli esim. kun luodaan instanssi jostakin luokasta StringBuilder sb1 = new StringBuilder("Hello"); StringBuilder sb2 = sb1; sb1.append(" World!"); Console.WriteLine(sb1.ToString()); // Hello World! Console.WriteLine(sb2.ToString()); // Hello World!

public class Henkilo string etunimi: string sukunimi public Henkilo() //konstruktori 1 public Henkilo(string etunimi, string sukunimi) // konstruktori 2 // asetetaan parametreina saadut arvot ominaisuuksiin this.etunimi = etunimi; this.sukunimi = sukunimi;

Hajottimen tehtävä on siivota jäljet (vapauttaa varatut resurssit) ennen olion poistamista. Luokalla voi olla vain yksi hajotin ja sitä kutsutaan automaattisesti tarvittaessa. Hajottimella ei ole määreitä eikä se ota vastaan parametreja. Hajotin esitellään ~ - merkillä. public class OmaLuokka ~OmaLuokka() // vapauta resurssit

Partial Class rakenteet namespace Sovellus1... public partial class OmaLuokka public string Teksti get; set; public int Numero get; set; namespace Sovellus1... public partial class OmaLuokka public string PalautaTeksti() return Teksti; public int PalautaNumero() return Numero;...

Atribuuteilla on aksessorit get ja set, jotka tarjoavat luku- ja kirjoitustoiminnallisuudet. public class Henkilo public char Sukupuoli get return sukupuoli; set sukupuoli = value;

Indeksereillä saadaan luokka näyttämään taulukolta, jolloin siihen päästään käsiksi [ ] -operaattorilla. Indekserit määritellään this-avainsanalla. Hakasulkujen sisään annetaan argumentit. Muuten määrittely muistuttaa Atribuuttien määrittelyä get- ja set -aksessoreineen. Hakusulkujen sisään voi antaa useita argumentteja ja ne voivat olla muutakin tyyppiä kuin int, taulukoista poiketen

public int this[int index] get // palauta arvo set // aseta arvo

Delegaatit ovat metodiosoittimia, eli delegaattia kutsuttaessa kutsutaankin sitä kuuntelevia metodeja. Delegaatti voi osoittaa useampaan metodiin yhtä aikaa. Delegaatin esittely muistuttaa metodia ilman toteutusta (abstrakti metodi) lisättynä delegate -avainsanalla. Määreiksi käyvät new sekä näkyvyysmääreet.

namespace DelegateDemo class OmaLuokka // delegaatin esittely public delegate void KirjoitaLokiin(string viesti); // delegaatin ilmentymä/instanssi public KirjoitaLokiin LokiDelegaatti get; set; public void SuoritaTehtava() // kutsutaan delegaattia LokiDelegaatti("Tehtävä suoritettu");

class Program static void Main(string[] args) OmaLuokka oma = new OmaLuokka(); // asetetaan delegaatti osoittamaan metodiin oma.lokidelegaatti = KirjoitaTiedostoon; // delegaattiin voi lisätä kuuntelijoita += operaattorilla oma.lokidelegaatti += KirjoitaTietokantaan; oma.suoritatehtava(); // delegaatista voi poistaa kuuntelijoita -= operaattorilla oma.lokidelegaatti -= KirjoitaTiedostoon; static void KirjoitaTiedostoon(string viesti)... static void KirjoitaTietokantaan(string viesti)...

2.2. Perintä ja rajapinnat - Ei moniperintää - Luokat voivat periä toisen luokan (kantaluokka), jolloin ne voivat laajentaa/muuttaa sen toiminnallisuutta. base-avainsanalla päästään käsiksi kantaluokan jäseniin - Kantaluokan jäsenen voi piilottaa new-avainsanalla tai metodit ja ominaisuudet voidaan määritellä virtuaalisiksi, jolloin perivä luokka voi ylikirjoittaa kantaluokantoteutuksen käyttämällä avainsanaa override

public class Kantaluokka public Kantaluokka() public Kantaluokka(string viesti)... public class Lapsiluokka : Kantaluokka public Lapsiluokka() // toinen konstruktoreista kutsuu kantaluokan konstruktoria parametrilla public Lapsiluokka(string viesti) : base(viesti)

public class Kantaluokka public void NormaaliMetodi() public virtual void VirtuaalinenMetodi() public class Lapsiluokka : Kantaluokka public new void NormaaliMetodi() public override void VirtuaalinenMetodi() Lapsiluokka ll = new Lapsiluokka(); ll.normaalimetodi(); // kutsuu lapsiluokkaa ll.virtuaalinenmetodi(); // kutsuu lapsiluokkaa Kantaluokka kl = ll; kl.normaalimetodi(); // kutsuu kantaluokkaa! kl.virtuaalinenmetodi(); // kutsuu lapsiluokkaa

interface EsimRajapinta void esimmetodi(); class ImplementoivaLuokka : EsimRajapinta void EsimRajapinta.esimMetodi() // koodi static void Main() EsimRajapinta obj = new ImplementoivaLuokka(); obj.esimmetodi;

2.3 Kapselointi Suojausmääreet (saantimääreet, näkyvyysmääreet) määräävät kuinka julkisia esim. luokat tai niiden jäsenet ovat. C#:ssa suojausmääreitä on neljä ja niitä voi määritellä vain yhden/luokka tai jäsen. Suojausmääreet ovat public: Näkyy kaikille. Kaikista sallivin. protected internal: Näkyy luokan sisällä, perineissä luokissa, sekä ko. assemblyn (exe, dll) sisällä internal: Näkyy assemblyn (exe, dll) sisällä protected: Näkyy luokan sisällä sekä perineissä luokissa private: Näkyy vain luokan sisällä. Kaikista suojatuin. Käytetään oletuksena.

2.4. geneerisyys Place holderit määritellään < ja > -merkkien väliin. Alla esimerkki metodista, joka voi vaihtaa muuttujien arvot keskenään riippumatta niiden tietotyypistä. Place holdereita voi olla myös useampia ja niille voi antaa omat nimensä public static class Vaihtaja public static void VaihdaArvot<T>(ref T eka, ref T toka) T temp = eka; eka = toka; toka = temp;

int a = 1, b = 2; // T korvataan tietotyypillä int Vaihtaja.VaihdaArvot<int>(ref a, ref b); // koska a:n ja b:n tiedetään olevan int-tyyppiä, // voi T:n määrittelyn jättää pois Vaihtaja.VaihdaArvot(ref a, ref b);

Myös geneeristen luokkien tekeminen on mahdollista. public class Jemma<T> List<T> objektit; public Jemma() objektit = new List<T>(); public void Lisaa(T objekti) objektit.add(objekti); Jemma<int> jemma = new Jemma<int>(); jemma.lisaa(123);

2.5. Poikkeukset int luku1 = 1, luku2 = 0, osamaara = 0; try osamaara = luku1 / luku2; catch (DivideByZeroException) // nollallajako-poikkeus... catch (Exception ex) // kaikki muut poikkeukset... finally // suoritetaan lopuksi...

3. Käyttöliittymäsuunnittelu ja oliot - Eli vaikka joku autolaskuri in action :)

Lähteet: http://fi.wikipedia.org/wiki/c_sharp http://en.wikipedia.org/wiki/c_sharp http://en.wikipedia.org/wiki/common_language_infrastructure http://en.wikipedia.org/wiki/common_language_runtime http://users.jyu. fi/~vesal/kurssit/winohj/csharp/seminaari05/cs_pikakurssi.pdf http://msdn.microsoft.com/fi-fi/library/kx37x362(en-us).aspx