具有不同范围属性的多个继承类

时间:2019-03-08 17:00:53

标签: kotlin

我不确定我想做的事情是不可能的还是我只是在想这完全错误,但是我想做的本质上是这个。我有一个密封的类,其中有多个类:

sealed class MySealedClass(val thing: Thing) : MyPropertyInterface
{
    val name: String = thing.name

    /** Base Methods Here */

    /** Obj 1 Constructor */
    class ObjOne(thing: Thing) : MySealedClass(thing)
    {
        override val properties = PropertyTypeOne()
        override val otherProperties = PropertyTypeTwo()

        inner class PropertyTypeOne(){
            val one = 1
        }

        inner class PropertyTypeTwo(){
            val two = 2
        }
    }

    /** Obj 2 Constructor */
    class ObjTwo(thing: Thing) : MySealedClass(thing)
    {
        override val properties = PropertyTypeOne()
        override val otherProperties = PropertyTypeTwo()

        inner class PropertyTypeOne(){
            val one = 1
        }

        inner class PropertyTypeTwo(){
            val two = 2
        }
    }
}

基本上,我希望密封类中的类以接口强制它们进行初始化的方式继承这些范围属性,因为它们将包含相同类型的属性但值不同。我希望对属性进行范围划分的原因是,我不想通过列表来访问它们,而是希望直接访问它们(只是为了提高可读性),并且没有范围,它可能使您不清楚要访问的内容。我意识到我可以为包含所述具有所述属性的类的密封类内的每个类创建一个自定义接口,但是我的问题是,我想以某种方式对密封类内的类强制执行此规则他们必须构造这两个数据结构。通过为每个类创建自定义接口,有可能由于人为错误而使其中一个不再符合标准。

1 个答案:

答案 0 :(得分:0)

这是我获得期望结果的解决方案:

sealed class MySealedClass(val p0: Int, val p1: Int) : MyProperties{

    /** Base properties and methods */

    class MyClassA(p0: Int, p1: Int) : MySealedClass(p0, p1){
        override val propertyListOne: MyProperties.PropertiesA = MyProperties.PropertiesA()
        override val propertyListTwo: MyProperties.PropertiesB = MyProperties.PropertiesB()
    }

    class MyClassB(p0: Int, p1: Int) : MySealedClass(p0, p1){
        override val propertyListOne: MyProperties.PropertiesC = MyProperties.PropertiesC()
        override val propertyListTwo: MyProperties.PropertiesD = MyProperties.PropertiesD()
    }
}

interface MyProperties{
    val propertyListOne: Any
    val propertyListTwo: Any

    class PropertiesA{
        val one = 1
    }

    class PropertiesB{
        val two = 2
    }

    class PropertiesC{
        val three = 3
    }

    class PropertiesD{
        val four = 4
    }
}

fun testMethod(){
    val newClassA = MyClassA(0, 0)
    newClassA.propertyListOne.one
    newClassA.propertyListTwo.two
    val newClassB = MyClassB(0, 0)
    newClassB.propertyListOne.three
    newClassB.propertyListTwo.four
}

我意识到,只需创建列表就可以轻松完成所有这些工作,但我特别不希望索引这些值。同样,这种结构使我正在处理的代码的对象结构的层次结构更易于理解和阅读。