2011-03-12 141 views
2

考慮到類冗餘繼承?

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

是的,它是多餘的。

,您可以將其刪除,並ProductService仍將實現IService<Product>

2

是的,從ServiceBase<Product>繼承我只是做了測試就足夠了。
但最簡單的檢查方法是查看派生類是否還包含由接口定義的方法/屬性(通過IntelliSense)。

+0

智能感知訣竅是不是安全的,因爲你也可以不實現接口 – digEmAll 2011-03-12 14:36:09

+0

@digEmAll定義相同的方法,但你不會得到一個錯誤/警告信息,告訴你,你有一個重複的方法,你應該使用'新'關鍵字,如果你打算重寫它,或類似的東西......你知道我在說什麼。在任何情況下,如果您確實想要檢查/測試以獲得問題的答案,請不要在派生類中使用另一種具有相同定義的方法。 :) – Kon 2011-03-12 14:38:33

+0

@Marc,苦多? – Kon 2011-03-12 14:41:45

2

這一切都取決於爲什麼 ...

它本身沒有什麼增加,也許除了一個名字。如果你有一個不喜歡泛型的序列化程序(除非被包裝),或者如果你想添加/覆蓋方法/屬性,或者你只是想要一個固定的名字,這可能會很有用。

還要注意,可以使用擴展方法向這些類型(無繼承)添加(-ish)方法,並且可以使用使用別名在單個文件中將其命名爲

我個人不會繼承它,除非我有一個原因。

+1

我不明白這是如何回答冗餘問題。 – Kon 2011-03-12 14:35:41

+0

啊,我正在解釋**整個類型**是多餘的... – 2011-03-12 14:48:48

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(); 

    }   
}