Hej. Jaha... Här har du lite om inheritance och abstract classes. Tackar så mycket! Jaha, fortsätter här på monologen. :) För att anropa en konstruktor ifrån en annan så använder du :this() (istället för :base()). MEN du kan inte ha med båda. Det kan ju annars bli så att base() anropas flera gånger. Ett alternativ är att göra en klass metod som du anropar från både default konstruktorn och de andra konstruktorerna om du vill ha koden på ett ställe. Trevligt med någon mer än mig själv som postar i tråden. :)Arv och konstruktion av objekt.
Har en fråga hur jag bör lösa följande.
Jag har en BasKlass: Dokument.
public class Document : xml.xCommons
{
public string RetrievalReference { get; set; }
public string Country { get; set; }
public string DocNumber { get; set; }
public string Kind { get; set; }
protected Document()
{
}
public Document(string RetrievalReference, string Country, string DocumentNumber)
: this()
{
this.RetrievalReference = RetrievalReference;
this.Country = Country;
this.DocNumber = DocumentNumber;
}
public Document(string RetrievalReference, string Country, string DocumentNumber, string Kind)
: this(RetrievalReference, Country, DocumentNumber)
{
this.Kind = Kind;
}
}
}
(xml.xCommons innehåller en del statiska medlemmar i form av lite XName's osv som jag använder mycket i koden.)
Jag har i koden utelämnat en hel del som klassen har. hursomhelst.
Nästa steg är att den här klassen finns det egentligen 3 olika typer av. De är mycket lika som sånär på ett värde av RetrievalReference, som i dagsläget beskriver vad det är för typ av dokument.
Jag vill helst oxå att de här tre typerna skulle kunna ligga som egenskaper hos "Dokument" men var och en av egenskaperna skall forfarande inneha funktionalitet med mera ifrån den här "Dokument"-klassen.
Jag tänker då... Jag skapar de här tre klasserna då och "ärver" in Dokument i var och en.
Här är ett exempel på en av dessa subklasser:
public class PublicationDocument : Document
{
public PublicationDocument()
{
this.RetrievalReference = xnaPubRef.LocalName;
}
}
(xnaPubRef är ju en statiskmedlem som ursprungligen kommer i från "xml.xCommons som ju ärvdes av basklassen".
Nu till min fundering.
Jag skulle hemskt gärna kunna använda konstruktörerna från Dokument-klassen i dessa subklasser oxå.
Vilka alternativ finns för detta (förutom att använda copy/paste) - Vill i framtiden kunna underhålla EN konstruktor så att det påverkar alla samtidigt. Kanske om man på något liknande sätt som : this() efter "kontruktorskapningen" fast man hänsvisar till en specifik basklass's konstruktor? Kanske sker detta vid själva skapandet av objektet "utanför"?
Något i stil med:
//detta funkar inte: (men något i stil med detta kanske fungerar? hur isf?)
PublicationDocument newDoc = new Document(string p1, string p2, string p3);
Även tacksam för lite feedback om jag kanske rent arkitekturmässigt tänker helt galet i mina funderingar kring subklasser etc?
Best Regards
Fredrik L
Sv: Arv och konstruktion av objekt.
Får väl svara på mitt egna inlägg. Men jag behöver en liten bekräftelse på om jag tänker rätt.
Det jag tror jag söker är att använda min "Dokumentklass" som en "Abstrakt klass" åt mina tre andra subklasser?
Om någon har några bra sidor eller något man kan läsa om hur man hanskas med den här typen av klasser, eller om det är något speciellt man bör tänka på innan man gör detta?
Best Regards
Fredrik LSv:Arv och konstruktion av objekt.
http://en.csharp-online.net/Inheritance_and_Polymorphism%E2%80%94Abstract_Classes
Lite om ditt problem, dock java..:
http://www.sap-img.com/java/does-a-class-inherit-the-constructors-of-its-superclass.htmSv: Arv och konstruktion av objekt.
Jag hade även tillgång till books24x7, där fanns det en hel del matnyttigt oxå.
Framförallt så gav länken du gav mig beskedet:
Vill jag kunna nå mina konstruktorer från basklassen (Känns lite pinsamt att man inte kom på det förut hehe)
public class PublicationDocument : Document
{
public PublicationDocument()
{
this.RetrievalReference = xnaPubRef.LocalName;
}
public PublicationDocument(string p1, string p2, string p3)
: base(p1, p2, p3)
{ //Nyckelordet är Base... (Natulrligtvis) }
}
<i>(Så nu vet alla andra som läser den här tråden det i framtiden)</i>
Frågan återstår då.
Jag läste på några ställen att det är lite av bestpractice att låta superklassen stå som Abstrakt?
Men ur en abstrakt klass kan man ju inte instansiera objekt.
Jag tror jag skulle vilja göra det. och då att Dokument själv dessutom innehåller tre fält som innehåller dessa tre subklasser..
MEN... Jag skulle naturligtvis ochså kunna skapa ytterligare en klass. Som mer beskriver innehållet av de tre dokument-typerna, och sedan i den här klassen ha 3 fält med de tre olika dokumenteten i?
Detta skulle kanske rent av bli bättre?
Vad tror ni?
Sv:Arv och konstruktion av objekt.
public class PublicationDocument : Document
{
public PublicationDocument()
{
this.RetrievalReference = xnaPubRef.LocalName;
}
public PublicationDocument(string Country, string DocNumber, string Kind)
: base(Country, DocNumber, Kind)
{ //this.RetrievalReference = xnaPubRef.LocalName;
}
public PublicationDocument(XElement DocumentNode)
: base(DocumentNode)
{ }
}
Här har vi nu klassen. Document är nu en abstrakt klass. PublicationDocument är en konkret.
Jag vill att även när jag använder konstruktorn med 3 strängar som inparameter.. så skall ALLTID defaultkonstruktorn köras (dvs sätta RetrievalReference).
Hur gör man detta?
Best Regards
Fredrik L.
Sv: Arv och konstruktion av objekt.
Vidare så finns det ingen anledning att göra en basklass abstrakt om den inte innehåller abstrakta metoder, properties, delegates eller events. Abstrakta är de om de endast är definierade med sin signatur men inte har någon kod, dvs man talar om för kompilatorn att en metod, property, delegate eller event med denna signaturen måste finnas i den ärvda klassen. Det finns också en klasstyp som heter interface som endast innehåller abstrakta metoder osv. En abstrakt klass kan sägas vara en blandning mellan en vanlig klass och ett interface. Man kan också säga att abstrakta metoder är som virtuella fast utan någon kod i basklassen.
/RubenSv:Arv och konstruktion av objekt.
ok, fint...
Nu har jag förvisso kontruerat i det här fallet Document till en Abstrakt klass...
Jag vet inte om jag tänker "Best Practice" nu.. Men när jag tänkte mer på det. Så är det så att det finns en annan klass som använder Dokument som "Mall"... för 3 olika typer av detta dokument... Som ju i princip är identiska till sin natur av både funktionalitet och innehåll gällande propertys etc, och ja tillochmed base(constructors) är och bör vara dem samma för dessa "barn".
- Man skapar inte något Dokument - utan att det är något av de tre olika typerna.
Är det då lämpligt att dela upp den här entiteten eller gör man rätt i att kanske behålla den som "dokument" och helt enkelt låta propertyn styra över vilken typ av dokument det är?
Best Regards
Fredrik L