R中S4类继承的正确方式:子类为何出现父类重复槽位?
问题解答
额外槽位出现的原因
你在定义class2时使用了contains = c("class1"),这代表class2继承了class1的所有属性。在S4类体系中,子类会自动继承父类的全部槽位,所以class2对象自然会包含class1_vector和class1_vector2这两个来自父类的槽位,这是继承的默认行为。
而你同时又在class2里定义了class1_object这个槽位,等于让class2同时具备两种关系:
- 继承关系(is-a):class2是一种class1,因此拥有class1的所有槽位
- 包含关系(has-a):class2内部持有一个独立的class1对象
这两种关系被你混在一起,才导致出现了额外的槽位。
正确实现方案
方案1:仅保留包含关系(推荐)
如果你只是想让class2包含一个class1对象作为槽位,不需要继承class1,直接删除contains = c("class1")即可:
setClass( "class2", representation( class1_object = "class1", # Class 1类型的槽位 class2.frame = "data.frame" ) )
修改后,class2只会有你定义的class1_object和class2.frame两个槽位,不会出现来自class1的槽位。
方案2:同时保留继承与包含关系(不推荐,除非有明确需求)
如果确实需要让class2既继承class1,又持有独立的class1对象,那么创建class2对象时需要显式给继承来的槽位赋值为NULL:
some.function <- function(df){ object.class1 <- new("class1", class1_vector = as.character(NULL), class1_vector2 = as.numeric(NULL) ) object.class2 <- new("class2", # 给继承自class1的槽位赋值为NULL class1_vector = as.character(NULL), class1_vector2 = as.numeric(NULL), class1_object = object.class1, class2.frame = df) return(object.class2) }
内容的提问来源于stack exchange,提问作者sp29
相关产品推荐
相关产品推荐

