[//]: # (title: Schema inheritance) In order to reduce amount of generated code, previously generated [`DataSchema`](schema.md) interfaces are reused and only new properties are introduced Let's filter out all `null` values from `age` column and add one more column of type `Boolean`: ```kotlin val filtered = df.filter { age != null }.add("isAdult") { age!! > 18 } ``` New schema interface for `filtered` variable will be derived from previously generated `DataFrameType`: ```kotlin @DataSchema interface DataFrameType1 : DataFrameType ``` Extension properties for data access are generated only for new and overridden members of `DataFrameType1` interface: ```kotlin val ColumnsContainer.age: DataColumn get() = this["age"] as DataColumn val DataRow.age: Int get() = this["age"] as Int val ColumnsContainer.isAdult: DataColumn get() = this["isAdult"] as DataColumn val DataRow.isAdult: String get() = this["isAdult"] as Boolean ``` Then variable `filtered` is cast to new interface: ```kotlin val temp = filtered ``` ```kotlin val filtered = temp.cast() ```