2016-05-02 146 views
0

我做一個抽象的類層次結構,例如:實現一個抽象類的層次 -

abstract public class BaseDirectory { 
} 

abstract public class BaseUser() { 
    protected readonly BaseDirectory _DIR 
    BaseUser(BaseDirectory dir) { 
     _DIR = dir; 
    } 
} 

然後我實現了抽象層次:現在

class MyDirectory : BaseDirectory { 
    internal void SomeMethod() { 
    } 
} 

class MyUser : BaseUser { 
    MyUser(MyDirectory dir) : base(dir) 
    { 
    } 
    internal void SomeMethod() { 
     _DIR.SomeMethod(); // <- how to do this? 
    } 
} 

,從MyUser類,我想能夠訪問實例,我當然可以期待dirC#程序員如何在風格上實現這一點?MyUser覆蓋_DIR,其中包含未發佈的MyDirectory的私有屬性,在其他地方使用投射,完全是其他任何內容?

+0

你可以添加'SomeMethod'到'BaseDirectory'作爲'abstract'方法? – juharr

+0

@juharr我們假設'SomeMethod'特定於'MyDirectory' /'MyUser',並且在其他實現中必須拋出'NotImplementedException'。 – Alexander

回答

2

它可能取決於用例。但我會做的是在BaseUser抽象類使用泛型指定使用的目錄類型:

圖片是這樣的:

public abstract class BaseDirectory 
{ 

} 

public abstract class BaseUser<TDirectory> where TDirectory : BaseDirectory 
{ 
    protected readonly TDirectory _dir; 
    protected BaseUser(TDirectory dir) 
    { 
     _dir = dir; 
    } 
} 

public class MyDirectory : BaseDirectory 
{ 
    public void SpecificMethod() { } 
} 

public class MyUser : BaseUser<MyDirectory> 
{ 
    public MyUser(MyDirectory dir) : base(dir) 
    { 

    } 

    internal void SomeMethod() 
    { 
     // call specific method on type MyDirectory 
     _dir.SpecificMethod(); 
    } 
} 

這樣,你可以存取權限的_dir變量是MyDirectory類型而不是BaseDirectory。如果您需要使用不同目錄的多個MyUser實例,則還可以使MyUser類具有通用性。

我可能是完全錯誤的,這是總的垃圾,但至少,這是我會怎麼做:)

1

可以savely強制轉換的MyUser_DIR領域。通過它確保的構造,能有MyDirectory有一個instane:

(_DIR as MyDirectory).SomeMethod() 
+0

這就是我現在所做的,但它是否滿足「風格」要求? – Alexander

+0

你是什麼意思是「風格」? – scher

+0

儘可能爲新開發人員提供可讀和可寫的功能。 – Alexander