[英]abstract method in a virtual class
我有一個 c# Class 有很多虛擬方法,其中一些方法本質上是抽象的(它們在子類中完全實現,基礎 class 是空的)。
為了讓它編譯,我在基礎 class 中拋出一個 InvalidOperationException 並評論應該做什么。 這只是感覺很臟。
有沒有更好的方法來設計我的課程?
編輯:它用於將在加拿大運行的應用程序的中間層,一半的方法是通用的,因此是虛擬的。 一半的方法是針對特定省份的。
Public class PersonComponent()
{
public GetPersonById(Guid id) {
//Code to get person - same for all provinces
}
Public virtual DeletePerson(Guid id) {
//Common code
}
Public virtual UpdatePerson(Person p) {
throw new InvalidOperation("I wanna be abstract");
}
Public Class ABPersonComponent : PersonComponent
{
public override DeletePerson(Guid id)
{
//alberta specific delete code
}
public override UpdatePerson(Person p)
{
//alberta specific update codecode
}
}
希望這是有道理的
將基礎 class 標記為抽象,以及沒有實現的方法。
像這樣
public abstract class BaseClass
{
public abstract void AbstractMethod();
}
public class SubClass: BaseClass
{
public override void AbstractMethod()
{
//Do Something
}
}
您不能在抽象 class 之外擁有抽象方法。 將 class 標記為抽象意味着您將無法實例化它。 但這沒有任何意義。 你打算怎么處理一個 class 無論如何都沒有實現這些方法?
編輯:通過查看您的 class,是的,我將 PersonComponent 與 UpdatePerson 方法一起抽象。 或者,如果 UpdatePerson 只是不為 PersonComponent 做任何事情,請保持原樣,但將 PersonComponent 的 UpdatePerson 方法設為空。
想想你的 object 層次結構。 您想共享所有派生類的通用代碼,然后在基礎 class 中實現基礎功能。
共享基本代碼時,請注意模板模式。 使用公共方法並將其鏈接到具有核心/共享實現的受保護虛擬方法。 以“Core”結束共享實現方法名。
例如:
public abstract class BaseClass
{
protected virtual void DeletePersonCore(Guid id)
{
//shared code
}
public void DeletePerson(Guid id)
{
//chain it to the core
DeletePersonCore(id);
}
}
public class DerivedClass : BaseClass
{
protected override void DeletePersonCore(Guid id)
{
//do some polymorphistic stuff
base.DeletePersonCore(id);
}
}
public class UsageClass
{
public void Delete()
{
DerivedClass dc = new DerivedClass();
dc.DeletePerson(Guid.NewGuid());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.