2008-10-27 38 views
8

我有一個抽象方法的類,但我想能夠在設計器中編輯該類的子類。但是,除非可以創建父類的實例,否則設計者不能編輯該子類。所以我的計劃是用存根替換抽象方法並將它們標記爲虛擬 - 但是如果我創建另一個子類,如果忘記實現它們,我將不會收到編譯時錯誤。我可以強制子類重寫一個方法而不使其變爲抽象嗎?

有沒有辦法標記方法,以便他們必須由子類實現,而不標記爲抽象?

+0

你是如何設計設計基礎類的? – 2008-10-27 09:32:20

回答

9

那麼你可以做一些非常混亂的代碼,涉及#if - 即在DEBUG它是虛擬的(對於設計者),但在RELEASE它是抽象的。儘管如此,仍然是一種真正的痛苦。

但除此之外:基本上沒有。如果你想要設計師的支持,它不能是抽象的,所以你留下了「虛擬」(可能與基本方法拋出NotImplementedException)。

當然,你的單元測試將檢查方法是否已經實現,是嗎? ;-p

事實上,它可能會很容易通過仿製藥測試 - 即具有形式的通用測試方法:

[Test] 
public void TestFoo() { 
    ActualTest<Foo>(); 
} 
[Test] 
public void TestBar() { 
    ActualTest<Bar>(); 
} 

static void ActualTest<T>() where T : SomeBaseClass, new() { 
    T obj = new T(); 
    Assert.blah something involving obj 
} 
0

我知道它不太你是什麼之後,但你可以做基類中的所有存根將引發NotImplementedException。然後如果你的任何子類沒有覆蓋它們,當基類中的方法被調用時,你會得到一個運行時異常。

+0

是的,我已經這樣做了,但我想要一個編譯時異常。 – Simon 2008-10-27 11:56:33

0

組件類包含一個名爲「將designMode」布爾屬性,當你想你的代碼,以表現不同的設計師不是在運行,這是非常方便的。在這種情況下可能有些用處。

5

你可以在你的類中使用對實現習慣用法的引用。

public class DesignerHappy 
{ 
    private ADesignerHappyImp imp_; 

    public int MyMethod() 
    { 
     return imp_.MyMethod()  
    } 

    public int MyProperty 
    { 
     get { return imp_.MyProperty; } 
     set { imp_.MyProperty = value; } 
    } 
} 

public abstract class ADesignerHappyImp 
{ 
    public abstract int MyMethod(); 
    public int MyProperty {get; set;} 
} 

DesignerHappy只是公開您想要的接口,但將所有調用轉發給實現對象。您通過對ADesignerHappyImp進行子分類來擴展行爲,這會強制您實現所有抽象成員。

可以提供ADesignerHappyImp,用於默認初始化DesignerHappy和揭露一個屬性,它允許您更改執行的默認實現。

0

一般情況下,如果有一種語言沒有辦法做一些事情,通常意味着有一個很好的概念理由不這樣做。

有時候這會成爲語言設計師的錯,但並不常見。通常我發現他們更瞭解語言設計,比我做的;-)

在這種情況下,你想有一個未覆蓋的虛方法拋出編譯時異常(而和運行時的一個)。基本上是一個抽象的方法。

製作虛擬方法的行爲就像抽象的人只是要爲你進一步造成混亂的世界的路線。另一方面,VS插件的設計往往不在同一層次上(這有點不公平,但在語言設計階段的應用肯定不那麼嚴謹 - 正確的是這樣)。一些VS工具,比如類設計師和WPF編輯,都是不錯的主意,但並不完整。

在你描述的情況下,我認爲你有一個參數不要使用類設計器,而不是一個參數來破解你的代碼。

在某個時候(也許在下一個VS),他們會清理類設計者如何處理抽象類,然後你就會不知道爲什麼它是以這種方式編碼的。

它應該永遠是破解你的代碼以適應設計師的最後手段,並且當你嘗試保持黑客最小化時。我發現,通過簡潔易讀的代碼,通過拜占庭代碼可以快速理解當前破壞的工具,這通常會更好。

+0

這在Visual Studio中一直是一個缺陷,但是您不能犧牲工具缺少多年的可讀性和可維護性。你有沒有試過以編程方式修改複雜的WinForms?這需要更長的時間,並且是很多挫折的源泉。微軟包括設計師是有原因的,我認爲做一點「黑客行爲」來提高項目的可維護性是完全合法的。只要確定記錄你在做什麼,爲什麼。 – Tim 2010-08-13 18:48:20

+0

@Tim - 我並不是說它不合法,我的觀點是它應該是破解代碼以適應工具的最後手段。在這種情況下,我認爲最好的解決方案實際上是在接受的答案中 - 在虛擬成員中拋出`NotImplementedException`,並且單元測試代碼。 – Keith 2010-08-16 08:37:17

1

請注意,「DesignMode」未在構造函數中設置。它在VS解析InitializeComponents()方法之後設置。

0

以ms爲例...

Microsoft在silverlight中使用用戶控件模板執行此操作。 #if是完全可以接受的,並且它的工具很快就能解決問題。恕我直言

相關問題