From mtmorgan at fhcrc.org  Tue Aug 18 15:42:48 2009
From: mtmorgan at fhcrc.org (Martin Morgan)
Date: Tue, 18 Aug 2009 06:42:48 -0700
Subject: [Rd] S4: inheritance of validity methods?
In-Reply-To: <op.uyti9if2dacko8@tir-070312.staff.few.eur.nl> (Vitalie S.'s
	message of "Mon, 17 Aug 2009 20:06:44 +0200")
References: <op.uyti9if2dacko8@tir-070312.staff.few.eur.nl>
Message-ID: <6phocqdxmp3.fsf@gopher4.fhcrc.org>

"Vitalie S." <vitosmail at rambler.ru> writes:

> Dear Developers,
>
> In current implementation of validity method, objects are first
> coerced to  superclass (slots are striped). Thus, it is not possible
> to write validity  method which would perform some checks on children
> slots.
>
> Say, I want to check if number of slots in a class is equal to "n":
>
> setClass("A", representation(a="numeric", n="integer"),
>           prototype=list(a=12, n=1L),
>           validity=function(object){
>               if(length(slotNames(object))!=object at n+1) paste("Number
>               of  slots must be ", object at n)
>               else TRUE
>           })
>
>
> setClass("B", representation(b="numeric"), contains="A",
>           prototype=list(a=12, b=14, n=2L))
>
>
> new("B", a=11, b=33)
> Error in validObject(.Object) :
>    invalid class "B" object: Number of slots must be  2
>
> Error, because an object of class "A" is passed to validObject with
> one  slot "b" removed and n=2.
>
> Is were a work around for this, or I am just doomed to write the same
> validity method for each children class?

I think you're doomed, but checking the number of slots in an instance
seems like a very unusual validity method -- isn't this the job of the
methods package, not your implementation of particular classes?

Martin

> Many thanks,
> Vitalie.

-- 
Martin Morgan
Computational Biology / Fred Hutchinson Cancer Research Center
1100 Fairview Ave. N.
PO Box 19024 Seattle, WA 98109

Location: Arnold Building M1 B861
Phone: (206) 667-2793



[Rd] S4: inheritance of validity methods?
Martin Morgan