2016-02-15 17 views
3

鑑於以下兩類如何聲明兩個類,以便它們可以傳遞給相同的函數?

public class LocalFoo { 

} 

public class RemoteFoo { 

} 

這兩個類都應該有類似的特性:

public string strBar{ get; set; } 
public int intBar{ get; set; } 

區別在於如何將這些屬性設置和讀取 - 在性能本地處理在前一種情況下 - 由程序。在後者中,這些屬性直接從數據庫中讀取和寫入一個DataTable。

我知道繼承必須在這裏發生,但這就是我陷入困境的地方。

例如,如果我聲明的方法TakesFoo

public void takesFoo(Foo bar){ 
    /*Magic Happens Here*/ 
} 

我想,爲了能夠調用該方法與任一類型的LocalFooRemoteFoo的對象。

我知道我可以寫一個抽象類Foo:

public abstract class Foo{ 
} 

,並有LocalFoo和RemoteFoo都從它繼承,但有一個警告 - 我還有一個抽象類,我需要RemoteFoo繼承被用來製作它更容易讀/寫/從數據表 -

public abstract class DRHelper : IEquatable<DRHelper>, IDisposable { 
} 

我最初的本能是讓富的接口,但我不知道這是否會工作,我希望有人可以給我如何我一些方向應該處理這個問題。

+4

接口。答案是界面:)但是,你應該小心,你不是爲了重用代碼而繼承。這不是適當的繼承使用(封裝通常是代碼重用的首選)。 –

+1

*「我最初的本能是讓Foo成爲一個界面」*做到這一點。 –

+0

@Codor'Foo'不需要繼承任何東西--RemoteFoo需要繼承'DRHelper'。 – Will

回答

9

創建一個具有IFoo的接口:

string strBar{ get; set; } 
int intBar{ get; set; } 

類LocalFoo和類RemoteFoo將都需要實現IFoo的接口。

然後改變你的方法爲:

public void takesFoo(IFoo bar){ 
    /*Magic Happens Here*/ 
} 
-1

我想,你應該使用Visitor Pattern

它可以讓你避免if(bar is LocalFoo)代碼。

public abstract class Foo 
    { 
     public abstract void Accept(IVisitor visitor); 
    } 

    public class LocalFoo : Foo 
    { 
     public override void Accept(IVisitor visitor) 
     { 
      visitor.Visit(this); 
     } 
    } 

    public class RemoteFoo : Foo 
    { 
     public override void Accept(IVisitor visitor) 
     { 
      visitor.Visit(this); 
     } 
    } 

    public interface IVisitor 
    { 
     void Visit(LocalFoo foo); 
     void Visit(RemoteFoo foo); 
    } 

    public class Visitor : IVisitor 
    { 
     public void Visit(RemoteFoo foo) 
     { 
      /*Magic Happens Here*/ 
     } 

     public void Visit(LocalFoo foo) 
     { 
      /*Magic Happens Here*/ 
     } 
    } 
+0

除了我的代碼不關心傳入對象是否是'RemoteFoo'或'LocalFoo',只要它具有屬性'strBar'和'intBar'。 – Will

+1

這意味着比喬的答案是正確的答案 - 只是使用一個接口 – Alex

+0

我知道 - 我不得不等待時間過去,以標記它是正確的。 – Will

相關問題