Toon posts:

[alg/.net]complex inheritance probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Situatie: ben nog steeds bezig met het schrijven van een vastgoed website in 3 tiers gebruikmakend van een Domain model samen met een datamapper.

Omdat mijn gronden overerven van vastgoed, en mijn huizen ook van vastgoed heb ik een speciaal soort mapper moeten gebruiken namelijk Class table inheritance (Fowler).

load werkt al
update nog niet

Ik zit nu met de volgende klassen
-AbstractMapper
-VastgoedMapper
-AbstractVastgoedMapper
-Huismapper.

voor een update:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Class Vastgoedmapper...
    public overrides sub update(aDomainObject as Domainobject)
        dim id as integer= aDomainObject.getId
        if typeOf aDomainObject is huis then huismapper.create.callUpdate  (adomainobject)
        if typeOf aDomainObject is Grond then Grondmapper.create.callUpdate(aDomainObject)
    end sub
end class

'nu komt het probleem :-)
Class Huismapper
    public function callUpdate(aDomainObject as Domainobject)
        'Deze methode roept de abstractMapper.update methode op
        update(aDomainobject)
        'deze methode roept de abstractMapper.update methode op, uitgevoerd in de klasse AbstractVastgoedMapper
        mybase.update(aDomainObject)
        'hier loopt het dus mis.
        'eerst nog een code fragment van mijn update function
end class


class AbstractMapper
    public overrdable Sub update(aDomainObject as Domainobject)
        dim id as integer = aDomainObject.getId
        mapOr(aDomainObject)
        Da.id = new sqlint32(id)
        da.update()
        loadedMap(id) =aDomainObject)
    end sub
end class

'voorbeeld van de methode mapOr die geimplementeerd is zowel in klasse AbstractVastgoedMapper als in Huismapper
public sub mapOr
    dim aDalVastgoed as new dalVastgoed()
    dim aVastgoed as new vastgoed
    avastgoed.bla = aDalvastgoed.bla
    .....
    DA = adalVastgoed 'DA = waar mijn Dal wordt in gestockeerd, dit werkt perfect, don't worry
end sub

Het probleem:
'mybase.update(aDomainObject) >> hij gaat deze methode dan wel runnen in de class AbstractVastgoedMapper maar de methode die hij aanroept(mapOr) runt hij terug in de huismapper(zodat hij twee keer die mapor van huismapper oproept terwijl ik wil dat hij de eerste keer het huist mapt, en daarna het vastgoed (dus in mybase).

Ik hoop dat ik het probleem genoeg heb verduidelijkt.
Ik heb mij reeds een week bezig meegehouden, gistre de code afgeprint, eens rustig gelezen, wat zitten spelen met de UML maar ik kom er niet uit.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
kan je die mapOr method niet als volgt aanroepen:
code:
1
base.mapOr()


Of dat doe je al zie ik?

[ Voor 16% gewijzigd door whoami op 23-08-2003 17:16 ]

https://fgheysels.github.io/


Verwijderd

Topicstarter
neen want die mapOR wordt opgeroep in AbstractMapper in de methode update.
AbstractMapper heeft geen "moeder".

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:54
code:
1
2
3
4
5
6
7
Class Vastgoedmapper...
    public overrides sub update(aDomainObject as Domainobject)
        dim id as integer= aDomainObject.getId
        if typeOf aDomainObject is huis then huismapper.create.callUpdate  (adomainobject)
        if typeOf aDomainObject is Grond then Grondmapper.create.callUpdate(aDomainObject)
    end sub
end class

Waarom doe je dit eigenlijk?
Als je goed gebruik maakt van polymorphisme, dan hoef je toch zelf helemaal niet te gaan controleren welke method hij moet gaan aanroepen?

https://fgheysels.github.io/


Verwijderd

Topicstarter
Jawel want die methode wordt geinstantieerd van de klasse VastgoedMapper zelf
Als die nu geinstantieeerd werd van een klasse Huismapper dan konnek ik met een abstract method dit makkelijk doen idd.
Dit is "handiger" om dat de gebruiker (eigenlijk de UI ) niet moet weten of het nu gaat over een huis of over een grond

  • zoepercavia
  • Registratie: September 2001
  • Laatst online: 26-12-2025
Ik heb ook fowler's mapper geimplementeerd, en kwam het zelfde probleem tegen. Ik kon het niet net oplossen met polymorphisme en heb het gedaan door expliciet de mapper van de base aan te roepen, als volgt (Employee erft over van Person):
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class PersonMapper : AbstractMapper {
public override void Update(DomainObject obj)
        {
            Person person = ((Person)(obj));
            try
            {
                OleDbConnection connection = new OleDbConnection(ConnectionManager.Instance.ConnectionString);
                connection.Open();
                OleDbCommand command = new OleDbCommand(new PersonMapper().DataMap.UpdateStatement, connection);
                command.Parameters.Add(new OleDbParameter("dummy", person.Name));
                command.Parameters.Add(new OleDbParameter("dummy", person.Id));
                command.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception error)
            {
                throw new MapperFailure("Failed to update " + obj.GetType() + ", Sql: " + DataMap.UpdateStatement, error);
            }
            DeleteRelation(PersonRelations.Groups, person, typeof(Person), person.Groups);
            CreateRelation(PersonRelations.Groups, person, person.Groups);
        }

public class EmployeeMapper : PersonMapper {
public override void Update(DomainObject obj)
        {
            base.Update(obj);
            Employee employee = ((Employee)(obj));
            try
            {
                OleDbConnection connection = new OleDbConnection(ConnectionManager.Instance.ConnectionString);
                connection.Open();
                OleDbCommand command = new OleDbCommand(new EmployeeMapper().DataMap.UpdateStatement, connection);
                command.Parameters.Add(new OleDbParameter("dummy", employee.Function));
                command.Parameters.Add(new OleDbParameter("dummy", employee.Id));
                command.ExecuteNonQuery();
                connection.Close();
            }
            catch (Exception error)
            {
                throw new MapperFailure("Failed to update " + obj.GetType() + ", Sql: " + DataMap.UpdateStatement, error);
            }
        }
}


Zoals je ziet roept PersonMapper expliciet de updat van PersonMapper aan. Als iemand iets beter weet graag, want ik ben er ook niet zo blij mee. Ik had er ook geen rekening meegehouden dat het zo werkte (omdat mijn beeld van overerving verkeerd was). Volgens mij is het niet mogelijk om een overridden methode aan te roepen van een basisklasse.

[ Voor 26% gewijzigd door zoepercavia op 23-08-2003 17:41 . Reden: code opgefatsoeneerd ]

Panacea.NL als je geinteresserd bent in IT en Geneeskunde!


Verwijderd

Topicstarter
Ja ik zou het dus ook "manueel" kunnen doen door mijn code expliciet neer te schrijven.
Dit is dan wel een slecht design!
Heeft niemand dit probleem een keer tegengekomen èn kunnen oplossen?
Pagina: 1