Notice that ActionFilterAttribute is the default implementation for both IActionFilter and IResultFilter—it implements both of those interfaces. It’s meant to be totally general purpose, so it doesn’t provide any implementation (in fact, it’s marked abstract, so you can only use it by deriving a subclass from it). However, the other default implementations (AuthorizeAttribute and HandleErrorAttribute) are concrete, contain useful logic, and can be used without deriving a subclass. To get a better understanding of these types and their relationships, examine Figure 9-6. It shows that all filter attributes are derived from FilterAttribute, and also implement one or more of the filter interfaces. The dark boxes represent ready-to-use concrete filters; the rest are interfaces or abstract base classes. Later in this chapter, you’ll learn more about each built-in filter type.