Programiranje Za programere i one koji to žele postati ... |
|
25.10.2017., 16:16
|
#1
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
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 { get; set; }
public string Country { get; set; }
public override string ToString()
{
return StreetAddress + " ,\n" + Country;
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address ShippingAddress { get; set; }
}
public class Company
{
public string Name { get; set; }
public Address ShippingAddress { get; set; }
}
//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>() { ivo, ana};
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>() { ivo, ana, ina};
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)
|
|
|
25.10.2017., 17:20
|
#2
|
Registrirani korisnik
Registracija: Jul 2008.
Postova: 1,038
|
Quote:
bozoou kaže:
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 { get; set; }
public string Country { get; set; }
public override string ToString()
{
return StreetAddress + " ,\n" + Country;
}
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address ShippingAddress { get; set; }
}
public class Company
{
public string Name { get; set; }
public Address ShippingAddress { get; set; }
}
//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>() { ivo, ana};
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>() { ivo, ana, ina};
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.
|
|
|
25.10.2017., 17:46
|
#3
|
Registrirani korisnik
Registracija: Jun 2008.
Lokacija: zg
Postova: 3,342
|
Quote:
DIABLO III kaže:
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>() { ivo, ana, ina};
..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??
|
|
|
25.10.2017., 18:01
|
#4
|
Registrirani korisnik
Registracija: Jul 2008.
Postova: 1,038
|
Quote:
bozoou kaže:
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>() { ivo, ana, ina};
..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
{
...
}
|
|
|
|
Sva vremena su GMT +2. Trenutno vrijeme je: 20:59.
|
|
|
|