Abstract interpretation theory provides a semantic foundation for dataflow analysis of programs by formalizing the relationship between analysis and semantics. In the original theory for abstract interpretation, due to Cousot and Cousot, this relationship was given in terms of an adjoined pair of functions. One function, called the abstraction function, mapped data to their best description, while the second function, called the concretization function, mapped descriptions to the largest data object they described. Since this time, however, a number of other "frameworks" for abstract interpretation have been developed, differing in how the descriptions are related to the actual data used in computation. For instance, one framework uses only abstraction functions, another uses only concretization functions, while yet another allows an arbitrary approximation relation. We illustrate that each of these frameworks has certain advantages and limitations. This motivates our development and study of a general framework which encompasses these other approaches. We examine this framework with regard to three questions: when does approximation lift from base functions to all expressions; when is approximation transitive; and when is there an optimal approximation and how can it be inferred? Answers to these questions are not only interesting in the context of our framework but also provide a better understanding of the other frameworks.