各位前輩好
小弟最近在試著優化C# WPF程式碼,目前遇到一個問題
目前程式有多個Page在主畫面上置換並做各自的事
public partial class PageA : Page
{
public PageA()
{
InitializeComponent();
}
public void Start()
{
// do something
}
}
public partial class PageB : Page
{
public PageB()
{
InitializeComponent();
}
public void Start()
{
// do something
}
}
// 類推 PageC、PageD...
用的時候像這樣
public partial class Controller : Window
{
public Controller()
{
InitializeComponent();
pageA = new PageA();
pageA.Start();
pageB = new PageB();
pageB.Start();
//...
}
}
想要把它改成這樣的寫法,比較好維護的感覺
public partial class Controller : Window
{
public Controller()
{
InitializeComponent();
List<Page> pages = new List<Page>();
pages.Add(new PageA());
pages.Add(new PageB());
foreach(Page p in pages)
{
p.Start();
}
}
}
但是Page其實並沒有Start()可以讓我override
試過自定義一個class去繼承Page,然後再讓PageA那些去繼承
class BasePage : Page
{
public virtual void Start() { }
}
public partial class PageA : BasePage
{
public PageA()
{
InitializeComponent();
}
public override void Start()
{
// do something
}
}
但是馬上跳出Error: PageA的部分宣告不得指定不同的基底類別
想試試都不行
不知道有沒有辦法能在Page加一個Start(),讓我可以去override
還是有更好的做法呢
現在只能暫時用很笨的做法..
PageA pa = (PageA)pages[index];
pa.Start();
你可以使用Interface
宣告一個介面 簽章
public interface IPage
{
void Start();
}
實現IPage
public class PageA : IPage
{
public void Start()
{
Console.WriteLine("PageA");
}
}
public class PageB : IPage
{
public void Start()
{
Console.WriteLine("PageB");
}
}
呼叫使用
List<IPage> pageList = new List<IPage>()
{
new PageA(),
new PageB()
};
foreach (var item in pageList)
{
item.Start();
}
感謝dog830228大大,使用interface順利解決了我的問題!
但有一個疑問
大大你宣告的是 public class PageA : IPage
這樣把原本的Page拿掉沒有問題嗎?
我實際測試
(A) public class PageA : IPage
(B) public class PageA : Page, IPage
都運行的很順利
但就是不太明白(A)拿掉Page為什麼還可以跑得起來
目前有一個猜測
是不是xaml檔內已有宣告是繼承Page
透過partial,讓xaml檔和xaml.cs檔merge起來
變成 public class PageA : Page, IPage
所以才能順利執行的呢?
因為我不是使用WPF XD!!
因為C#不支援 多重繼承(最好也不要寫多重繼承)容易出事
上面的例子只是說你可以用介面來做
PS:我沒寫過WPF 以下的說明是我猜的
椅恩啾 我猜你說得沒錯
在\obj\Debug 資料夾中 可以看到.xaml動態產生程式碼的檔案
在裡面他是使用partial class
並繼承 Page
立馬查看了一下\obj\Debug\ 真的有看到partial class!
目前就先當我猜想的沒錯好了
謝謝!