Hej. i 2.0 gör du följande: Känns som du har missuppfattat något.Lösning på problem med abstracta klasser...
Jag har tidigare skrivet ett inlägg där jag hade problem med en abstract class. Till viss del kvarstår fortfarande problemet.
Här kommer lite exempel kod på vad jag gjort.
Min abstracta class:
<code>
public abstract class baseBusinessLayer
{
public abstract GeneralItem Get_specific(int id);
}
public class GeneralItem
{
int? id = null;
public int? Id
{
get
{
return id;
}
set
{
id = value;
}
}
</code>
Classen som använder sig av basklassen
<code>
public class businessUser:baseBusinessLayer
{
public override GeneralItem Get_specific(int id)
{
UserItem ui = new UserItem();
ui.Username = "test";
return ui;
}
public void testFunctin()
{
UserItem ui = (UserItem) Get_specific(123);
}
}
public class UserItem:GeneralItem
{
string username = string.Empty;
public string Username
{
get
{
return username;
}
set
{
username = value;
}
}
}
</code>
Tycker inte detta blir en snygg lösning eftersom jag får typecasta mitt UserItem i "testFunction()".
Visst måste detta gå att lösas snyggare med Generics och interface i ASP.NET 2.0. Man vill väl få bort alla typecastningar man fick göra i ASP.NET 1.1....
HälsningarSv: Lösning på problem med abstracta klasser...
<code>
public abstract class baseBusinessLayer<T> where t: GeneralItem
{
public abstract T Get_specific(int id);
}
public class GeneralItem
{
int? id = null;
public int? Id
{
get
{
return id;
}
set
{
id = value;
}
}
</code>
Classen som använder sig av basklassen
<code>
public class businessUser:baseBusinessLayer<UserItem>
{
public override UserItem Get_specific(int id)
{
UserItem ui = new UserItem();
ui.Username = "test";
return ui;
}
public void testFunctin()
{
UserItem ui = this.Get_specific(123);
}
}
public class UserItem:GeneralItem
{
string username = string.Empty;
public string Username
{
get
{
return username;
}
set
{
username = value;
}
}
}
</code>Sv: Lösning på problem med abstracta klasser...
Använd virituella metoder iställer för typecastSv:Lösning på problem med abstracta klasser...
1) En abstract metod är en virtuell metod med en constraint som säger "Must Implement"
2) Vid en override av en vrituell metod kan du inte ändra på metodens returtyp utan den måste se ut på exakt samma sätt som metoden du väljer att implementera om.
Du skulle teoretiskt sett kunna använda en teknik som heter "Method Hiding" (nyckelordet new i C#) för att skapa en helt ny implementation med samma namn, men då missar du hela polymorfism begreppet i dina klasser och dessutom är det vanligtvis till mer förtret än det hjälper.
I C# 2.0 använder vi generics för att slippa typecasts och för att kunna ändra på returvärdet i sub-implementationer.