簡體   English   中英

虛擬 class 中的抽象方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM