In my schematic capture app, I had a class hierarchy that started with Element. 
From that I derived PartDefinition and PartInstance. Element has an immutable 
UUID, name, and description. Element knows how to encode itself as XML by 
conforming to an XMLCoding protocol.

Now I'm trying to make Element into a Protocol, and make PartDefinition and 
PartInstance into structs. But I can't quite figure out how to inherit the 
XMLCoding implementation for Element. That is, Element can encode/decode its 
UUID, name, and desc. It does the decode in a convenience init(xml:) method 
that takes an XMLNode to parse.

So how to I add another init(xml:) method to one of my structs (like 
PartDefinition), and have it call the init(xml:) method on Element? With class 
inheritance, I was able to do this with a call to super. It's not clear to me 
how to do this with Protocols.

It needs to be in init() because I want some of the instance variables to be 
let and non-optional. Not actually sure how to do this.

protocol Element
{
    var uuid    :       UUID { get }
    var name    :       String?  { get }
    var desc    :       String?  { get }
}

extension Element
{
    init(xml inElement: XMLElement)
    {
        self.uuid = <parse from inElement>
    }
}

class
PartInstance : Element
{
    init()
    {
        self.uuid = UUID()
    }
    
    init(xml inElement: XMLElement)
    {
        //  Use shared implementation in Element extension?
    }

    let uuid: UUID
    var name: String?
    var desc: String?
}

class
PartDefinition : Element
{
    etc...
}

I may be missing some aspect of this entirely, but I'm having a hard time 
seeing how to avoid lots of code duplication in this scenario. Appreciate 
thoughts and advice…

-- 
Rick Mann
rm...@latencyzero.com


_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to