冗余继承?

时间:2011-03-12 14:27:38

标签: c# inheritance

考虑那些类

public class Category { }
public class Product { }

public interface IService<T> { }
public class ServiceBase<T> : IService<T> { }

public class CategoryService : ServiceBase<Category> { }
public class ProductService : ServiceBase<Product>, IService<Product> { }

ProductService的遗产是多余的?只需ServiceBase<Product>就够了吗?

我刚做了这样的测试

static void Main(string[] args) {
    Console.WriteLine("CategoryService interfaces:");
    foreach(var item in typeof(CategoryService).GetInterfaces()) {
        Console.WriteLine(item.Name);
    }

    Console.WriteLine("ProductService interfaces:");
    foreach(var item in typeof(ProductService).GetInterfaces()) {
        Console.WriteLine(item.Name);
    }

    Console.ReadKey();
}

输出

CategoryService interfaces:
IService`1
ProductService interfaces:
IService`1

4 个答案:

答案 0 :(得分:4)

是的,这是多余的。

您可以将其删除,ProductService仍会实施IService<Product>

答案 1 :(得分:2)

是的,继承ServiceBase<Product>就足够了 但最简单的检查方法是查看派生类是否还包含接口定义的方法/属性(通过IntelliSense)。

答案 2 :(得分:2)

这一切都取决于 为什么 ......

除了名字之外,它本身并没有增加任何东西。如果你有一个不喜欢泛型的序列化程序(除非被包装),或者如果你想添加/覆盖方法/属性,或者你只是想要一个固定名称,它可能会很有用。

另请注意,扩展方法可用于向这些类型添加(-ish)方法(无继承),并且可以使用using-alias在单个文件中将其命名为

除非我有理由,否则我个人不会将其分类。

答案 3 :(得分:1)

有一种情况是在派生类中重新实现IFoo不是多余的:如果IFoo接口是在基类中显式实现的,并且您想要覆盖实现。 看看这个例子:

interface IFoo
{
    void Foo();
}

class BaseFoo : IFoo
{
    void IFoo.Foo()    {
        Console.WriteLine("foo");
    }
}

// you can't ovverride the Foo() method without re-implementing the interface
class DerivedFoo : BaseFoo, IFoo 
{
    void IFoo.Foo()
    {
        Console.WriteLine("derived foo");
    }
}

class Example 
{

   static void Main() 
   {
        BaseFoo bf = new BaseFoo();
        ((IFoo)bf).Foo();

        bf = new DerivedFoo();
        ((IFoo)bf).Foo();

   }          
}