2011-08-24 202 views
0

這很奇怪,但我真的需要它。我需要繼承一個沒有繼承基類的類,但我不知道如何。(un)繼承C#

我有一個框架,這樣一個抽象基實體類:

public abstract class AbstractEntity 
{ 
    public bool Validate(){}; 
    public List<ValidationErrors> erros; 

    // and so many more properties and methods 
} 

我的自定義類繼承這個抽象基類:

public class Contact : AbstractEntity 
{ 
    public int id 
    public string name; 
    public string phone; 
} 

我使用這個類聯繫上一個web服務和我只需要自定義屬性,我如何重新使用類聯繫沒有繼承AbstractEntity

我不想重複這個類。對不起,如果這聽起來很愚蠢。

編輯

這已經是一個代碼生成器創建一個項目,我不能改變的類結構。出於這個原因,我想在沒有抽象類的情況下實例化那個類。

因爲我現在不能改變它,所以迫切需要它,我會在沒有抽象的情況下複製這個類並使用它。

+2

您可以使'AbstractEntity'的屬性受到保護,因此它不會被外部訪問,也不會被序列化。 –

+0

或者你可以將它們標記爲不可序列化。 –

+0

@Anthony Pegram - 我想他想要一個DTO而不必實際寫一個+轉換代碼。 –

回答

2

聽起來像你需要一個接口。

從AbstractEntity中提取接口(IAbstractEntity)。或者,也許從聯繫人的IContact - 問題不是很清楚哪個類具有您想要共享的方法和屬性。它看起來像這樣:

public interface IContact 
{ 
    int Id { get; } 
    string Name { get; } 
    string Phone { get; } 
} 

實施聯繫方式的IContact。然後修改任何只使用IContact中特定方法/屬性的方法來使用IContact而不是Contact。

,我和@傑米 - 彭尼同意,這聽起來像你應該閱讀http://en.wikipedia.org/wiki/Data_transfer_object

最後,如果這是一個DTO,你可能會發現自己需要的東西像AutoMapper

+0

是的,這是正確的方法,但項目已經用代碼生成器創建,現在我無法更改類結構。出於這個原因,我想在沒有抽象類的情況下實例化那個類。 –

1

由於就我所知,你無法打破繼承鏈。如果您想要一個不繼承AbstractEntity的Contact,則必須創建一個新的Contact類,該類不會將AbstractEntity列爲父級。

對不起,這就是C#的設計。

+0

這就是要點,我只是想打破繼承鏈,但我不能! –

0

嘗試遏制。

public class NotAnEntity 
{ 
    public Contact { get; set; } 

    public static implicit operator Contact(NotAnEntity other) 
    { 
     return other.Contact; 
    } 
} 
0

雖然我覺得用一個簡單的DTO很可能是最簡單的解決方案,另一種選擇是implement the IXMLSerializable interface您聯繫級別且只序列化你關心的屬性。當然,這也會在其他情況下影響對象的XML序列化,而不僅僅是Web服務。