webForumDet fria alternativet

Arkitektur på konstuktorn?

.NET

9 svar · 549 visningar · startad av Lilly

Medlem sedan okt. 200637 inlägg
Frågan#1

Jag har en fråga om konstruktorn som jag inte riktigt fått grepp om. Konstruktorn används för att instansiera ett objekt så långt är jag med. Men när ska man använda konstruktorn till mer än att bara instansiera ett objekt? Jag menar det är ju möjligt att lägga in en metodkropp och att konstruktorn tar emot inparametrar men när ska man göra det? Varför ska konstruktorn göra detta? Tacksam för alla svar!

Medlem sedan feb. 20002 300 inlägg
#2

Lilly skrev:

Jag har en fråga om konstruktorn som jag inte riktigt fått grepp om. Konstruktorn används för att instansiera ett objekt så långt är jag med. Men när ska man använda konstruktorn till mer än att bara instansiera ett objekt? Jag menar det är ju möjligt att lägga in en metodkropp och att konstruktorn tar emot inparametrar men när ska man göra det? Varför ska konstruktorn göra detta? Tacksam för alla svar!

För att du ska kunna initiera vissa av objektets medlemsvariabler med parametrarna i konstruktorn.

Medlem sedan okt. 200637 inlägg
#3

Att sätta properties i konstruktorn är ett klassiskt exempel men jag har inte riktigt förstått i vilka sammanhang detta skulle kunna vara bra att göra. Kan du ge något bra exempel?

Sen undrar jag i vilka sammanhang det kan vara aktuellt att lägga tex ett anrop till någon funktion i konstruktorn.

Medlem sedan feb. 20002 300 inlägg
#4

Lilly skrev:

Att sätta properties i konstruktorn är ett klassiskt exempel men jag har inte riktigt förstått i vilka sammanhang detta skulle kunna vara bra att göra. Kan du ge något bra exempel?

Sen undrar jag i vilka sammanhang det kan vara aktuellt att lägga tex ett anrop till någon funktion i konstruktorn.

Det blir ju helt enkelt en genväg till att sätta t.ex. properties eller via set-metoder.

new Bil(Color.Red, CarType.Suv);

Anrop i konstruktorn kan du t.ex. använda om du vet om att du ska göra mycket jobb i den men inte vill stöka ner för mycket i den. Om du har använt winforms i Visual Studio så vet du att alla VS automatiskt skapar en InitializeComponent-metod där alla kontroller som ligger på formen initieras. Den metoden anropas sen i Formens konstruktor.

Medlem sedan okt. 200637 inlägg
#5

Skulle man kunna sammanfatta det så här? Om man alltid eller ofta sätter properties i samband med en instansiering av ett objekt då bör man låta konstruktorn sköta jobbet så att det blir konsekvent.

En fråga till :) Vi antar att du har ett bilregister med olika bilar och du ska lägga till en ny bil. Ser du till att en konstruktor skapar bilen eller har du en funktion som heter tex createcar som du anropar efter det att instansierat objektet car?

Medlem sedan dec. 19996 721 inlägg
#6

Lilly skrev:

Att sätta properties i konstruktorn är ett klassiskt exempel men jag har inte riktigt förstått i vilka sammanhang detta skulle kunna vara bra att göra.

Om objektet kräver att en eller flera egenskaper är satta så är det rätt satt. Jämför:

public class MyObject
{
   public int MyField;
}

med

public class MyObject
{
   public int MyField;
   public MyObject(int myField)
   {
      MyField=myField;
   }
}

I det andra exemplet har vi helt plötsligt garanterat att MyField fått ett värde.

Medlem sedan juli 20011 304 inlägg
#7

En av de största fördelarna enlig mig är det som emission skriver. I språk som inte har konstruktorer och/eller konstruktorer som man kan överlagra är det vanligt att man måste köra nån Init eller Initialize metod som hämtar eller sätter värden för att kunna använda objektet rätt.

När jag nu som utvecklare skapar ett objekt kan jag tvinga de som ska använda mitt objekt att alltid skicka med vissa värden och dessutom kan jag garantera att viss logik alltid utförs genom att ropa på någon bra metod.

Medlem sedan okt. 200637 inlägg
#8

Jag försöker tänka mig något konkret fall där just detta skulle vara aktuellt men jag kan inte riktigt komma på något. Som ni säkert förstått så har jag ingen större praktisk erfarenhet av att jobba med mer "avancerade" konstuktorer än tomma metodkroppar och inga inparametrar.

Jag tycker dock börja förstå det hela bättre. Man skulle nog kunna sammanfatta det med:
1. Om man alltid eller ofta sätter properties i samband med en instansiering av ett objekt då bör man låta konstruktorn sköta jobbet så att det blir konsekvent.
2. Ett bra sätt att garantera att vissa värden sätts är att se till att de sätts via konstruktorn om detta är möjligt.

Hur vanligt är det att ni gör "avancerade" konstruktorer, dvs konstruktorer med metodkroppar och inparametrar? Hur ofta brukar ni skapa fler än en konstruktor? Jag förstår givetvis att det beror på vad det är man ska utveckla för något. Det är ändå intressant att få en känsla för hur ofta det sker rent generellt.

Har ni några tips på bra sidor på nätet man kan läsa mer om detta så tipsa gärna!

Medlem sedan juli 20011 304 inlägg
#9

Ja du har fattat det rätt.

Det är som du säger väldigt olika beroende på vad man gör. Jag använder ofta överlagringar av konstrukturn. Detta är för att mina objekt ska bli lätta att använda.

Säg att vi har ett connectionobjekt. Då vill jag kunna instatiera det på följande sätt:

MyconnectionClass conn = new Myconnectionclass(); // skapar en connection med defaultvärden från konfigfil
MyconnectionClass conn = new Myconnectionclass("connstr"); // skapar en connection till datakällan i connstr

Kanke inget lysande exempel men ändå...

Det spelar också en stor roll när man ärver klasser och ropar på den nedärvda klassens konstruktor i den nedärvda konstruktorn.

Du kan läsa lite och se exempel på det här: http://weblogs.asp.net/scottcate/archive/2005/11/23/431412.aspx

Medlem sedan jan. 20023 327 inlägg
#10

Konstruktorn ska initiera objektet till det initierings-tillstånd som krävs. Sedan finns det inget som hindrar dig att ha flera konstruktorer i en klass.

public class Entry {
    int id;
    String title;
    String content;

    public Entry(int id, String title, String content) {
        this.id = id;
        this.title = title;
        this.content = content;
    }

    public Entry(String title, String content) {
        this.title = title;
        this.content = content;
    }

}

/Edit, såg att Jon skrivit det jag tog upp :r

262 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)
127 ms — ändringar (db)