Natrag   Forum.hr > Informatička tehnologija > Za napredne korisnike > Programiranje

Programiranje Za programere i one koji to žele postati ...

Odgovor
 
Tematski alati Opcije prikaza
Old 25.10.2017., 16:16   #1
C# kolekcije sa različitim tipovima objekata

Pozdrav,

radi se o jeziku C#, želim napraviti jednostavan primjer ...kolekciju objekata koji će biti Person ili Company, a oboma je zajednički atribut "ShippingAddress"
-zatim želim iterirati kroz objekte i ispisati ShippingAddress.

E sad, u jezicima kojima sam dosad radio bi ovo bilo prilično jednostavno, vjerovatno je jednostavno i u C#, ali me buni kod njega ta stroga definicija koji tipovi se moraju nalaziti u listama ...i nisam siguran kojim putem bi se ovo ispravno rješilo.

Evo kako sam išao i gdje falim:

PHP Code:
    //Kreiram klase za tražene objekte:
    
public class Address
    
{
        public 
string StreetAddress getset; }
        public 
string Country getset; }

        public 
override string ToString()
        {
            return 
StreetAddress " ,\n" Country;
        }
    }
    public class 
Person
    
{
        public 
string FirstName getset; }
        public 
string LastName getset; }
        public 
Address ShippingAddress getset; }
    }
    public class 
Company
    
{
        public 
string Name getset; }
        public 
Address ShippingAddress getset; }
    }

    
//i sada definiram neka random tri objekta, uključujući tipove i iz person i iz company:

            
var ivo = new Person() { FirstName "ivo"LastName "ivković"ShippingAddress = new Address() { StreetAddress "Maksimir 21"Country "Hrvatska" } };
            var 
ana = new Person() { FirstName "ana"LastName "anka"ShippingAddress = new Address() { StreetAddress "Prečko 13"Country "Hrvatska" } };
            var 
ina = new Company() { Name "INA"ShippingAddress = new Address() { StreetAddress "Novi zagreb 15"Country "Hrvatska" } };

           var 
objlist = new List<Person>() { ivoana};


            foreach (var 
item in objlist)
            {
                
Console.WriteLine(item.ShippingAddress);
            } 


No problem nastaje kada u kolekciju želim uključiti i INU (company).
Probam recimo ovako:


PHP Code:
 var objlist = new List<object>() { ivoanaina}; 
ali onda dobivam grešku: "object" does not contain a definition for 'ShippingAddress' and no extension method 'ShippingAddress';

Bio bih zahvalan ako me netko uputi u ispravan način razmišljanja za nametnut problem. (Koji nebi trebao biti problem xd)
bozoou is offline  
Odgovori s citatom
Old 25.10.2017., 17:20   #2
Quote:
bozoou kaže: Pogledaj post
Pozdrav,

radi se o jeziku C#, želim napraviti jednostavan primjer ...kolekciju objekata koji će biti Person ili Company, a oboma je zajednički atribut "ShippingAddress"
-zatim želim iterirati kroz objekte i ispisati ShippingAddress.

E sad, u jezicima kojima sam dosad radio bi ovo bilo prilično jednostavno, vjerovatno je jednostavno i u C#, ali me buni kod njega ta stroga definicija koji tipovi se moraju nalaziti u listama ...i nisam siguran kojim putem bi se ovo ispravno rješilo.

Evo kako sam išao i gdje falim:

PHP Code:
    //Kreiram klase za tražene objekte:
    
public class Address
    
{
        public 
string StreetAddress getset; }
        public 
string Country getset; }

        public 
override string ToString()
        {
            return 
StreetAddress " ,\n" Country;
        }
    }
    public class 
Person
    
{
        public 
string FirstName getset; }
        public 
string LastName getset; }
        public 
Address ShippingAddress getset; }
    }
    public class 
Company
    
{
        public 
string Name getset; }
        public 
Address ShippingAddress getset; }
    }

    
//i sada definiram neka random tri objekta, uključujući tipove i iz person i iz company:

            
var ivo = new Person() { FirstName "ivo"LastName "ivković"ShippingAddress = new Address() { StreetAddress "Maksimir 21"Country "Hrvatska" } };
            var 
ana = new Person() { FirstName "ana"LastName "anka"ShippingAddress = new Address() { StreetAddress "Prečko 13"Country "Hrvatska" } };
            var 
ina = new Company() { Name "INA"ShippingAddress = new Address() { StreetAddress "Novi zagreb 15"Country "Hrvatska" } };

           var 
objlist = new List<Person>() { ivoana};


            foreach (var 
item in objlist)
            {
                
Console.WriteLine(item.ShippingAddress);
            } 


No problem nastaje kada u kolekciju želim uključiti i INU (company).
Probam recimo ovako:


PHP Code:
 var objlist = new List<object>() { ivoanaina}; 
ali onda dobivam grešku: "object" does not contain a definition for 'ShippingAddress' and no extension method 'ShippingAddress';

Bio bih zahvalan ako me netko uputi u ispravan način razmišljanja za nametnut problem. (Koji nebi trebao biti problem xd)

Implementiraj zajednički interface. IAddressHolder ili nešto vezano uz adresu.
DIABLO III is offline  
Odgovori s citatom
Old 25.10.2017., 17:46   #3
Quote:
DIABLO III kaže: Pogledaj post
Implementiraj zajednički interface. IAddressHolder ili nešto vezano uz adresu.
Nisam baš siguran da sam skužio što točno hoćeš reći.

...u međuvremenu sam došao do polimorfizma, tj. mogućnosti da se neki objekt koristi kao više različitih tipova. Što znači da se objekt može koristiti kao type onoga što jeste ...i kao type klase koju je naslijedio.

Što će reći da bi mogao napraviti neku izvornu klasu, tipa:

PHP Code:
    public class ShippingTask
    
{
        public 
virtual ShippingAddress;
    } 
zatim da klase Person i Company naslijede svojstva shippingTask-a ...i onda bi collection mogao komotno izgledati:

PHP Code:
var objlist = new List<ShippingTask>() { ivoanaina}; 
..i stvar bi šljakala, ali mi nije logično da Person i Company moraju nasljeđivati svojstva nekakvog shippingTaska :/

Vjerujem da se pravilno rješenje krije negdje tu..da se na kraju dobiju objekti koji djele zajednička svojstva pa da lako upadaju u kolekciju istog type-a. Samo kako bi ispravan pristup bio...i dalje nisam siguran...

I zašto mi se ovo čini nepotrebnim ograničenjima od strane programskog jezika??
bozoou is offline  
Odgovori s citatom
Old 25.10.2017., 18:01   #4
Quote:
bozoou kaže: Pogledaj post
Nisam baš siguran da sam skužio što točno hoćeš reći.

...u međuvremenu sam došao do polimorfizma, tj. mogućnosti da se neki objekt koristi kao više različitih tipova. Što znači da se objekt može koristiti kao type onoga što jeste ...i kao type klase koju je naslijedio.

Što će reći da bi mogao napraviti neku izvornu klasu, tipa:

PHP Code:
    public class ShippingTask
    
{
        public 
virtual ShippingAddress;
    } 
zatim da klase Person i Company naslijede svojstva shippingTask-a ...i onda bi collection mogao komotno izgledati:

PHP Code:
var objlist = new List<ShippingTask>() { ivoanaina}; 
..i stvar bi šljakala, ali mi nije logično da Person i Company moraju nasljeđivati svojstva nekakvog shippingTaska :/

Vjerujem da se pravilno rješenje krije negdje tu..da se na kraju dobiju objekti koji djele zajednička svojstva pa da lako upadaju u kolekciju istog type-a. Samo kako bi ispravan pristup bio...i dalje nisam siguran...

I zašto mi se ovo čini nepotrebnim ograničenjima od strane programskog jezika??
Slično tome kao što si napravio uradiš sa interfaceom.
Obje klase implementiraju taj interface te implementiraju metodu da ti vrati adresu.

Nemaju zajedničkog roditelja, već samo dijele funkcionalnost da oboje moraju vratiti adresu ako ih se to traži.


Ne znam c#, al nešto u ovom stilu

interface IAddreesHolder
{
Address getAddress();
}

class Company : IAddressHolder
{
...
}

class Person: IAddressHolder
{
...
}
DIABLO III is offline  
Odgovori s citatom
Odgovor



Kreni na podforum




Sva vremena su GMT +2. Trenutno vrijeme je: 20:59.