2011-02-18 80 views
0

我具有以下在一些不同的類的功能C1,D2,F34:如何避免複製粘貼的異常功能?

class C1 
{ 
    void SomeFunc 
    { 
     Statement1(); 
     Obj = GetObj(); 
     Statement2(Obj); 
    } 
    IMyObj Obj{get;private set;} 
} 

public static class MyObjExt 
{ 
    public static void Statement2(this IMyObj obj) 
    { 
     ... do validation of 'obj'; 
     ... throw exception if object state is wrong 
    } 
} 

類C1,D2,F34不相同的層次結構的構件。

所以我想避免複製粘貼它們。

我可以做這樣的事情:

static MyObj MyFunc() 
{ 
    Statement1(); 
    IMyObj obj = GetObj(); 
    Statement2(obj); 

    return obj; 
} 
class C1 
{ 
    void SomeFunc 
    { 
     Obj = MyFunc(); 
    } 
    IMyObj Obj{get;private set;} 
} 

但如果「聲明2」函數拋出一個異常OBJ成員將未初始化...

我怎麼能避免複製粘貼?

+2

你想要發生什麼? – 2011-02-18 20:31:46

+0

我想要'Obj'屬性總是初始化。特別是,如果在'Statement2'中引發異常。 – Budda 2011-02-18 20:38:40

回答

1

我有一點點複雜的解決方案:

class Extender 
{ 
    static IMyObj MyFunc(out IMyObj obj) 
    { 
     Statement1(); 
     obj = GetObj(); 
     Statement2(obj); 
    } 
} 

class C1 
{ 
    void SomeFunc 
    { 
    IMyObj obj=null; 
    try 
    { 
     MyFunc(out obj); 
    } 
    finally 
    { 
     Obj = obj; 
    } 
    } 
    IMyObj Obj{get;private set;} 
} 

但我不知道這是否會和必須工作。這是好還是壞的方法?

如果您認爲它是好的 - 請投票,如果沒有 - 請指出「爲什麼」?

非常感謝!

編輯:修改後添加了'SomeFunc'實現。