考虑那些类
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
答案 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();
}
}