【问题标题】:abstract method in a virtual class虚拟类中的抽象方法
【发布时间】:2010-10-11 10:19:36
【问题描述】:

我有一个 c# 类,它有很多虚拟方法,其中一些方法本质上是抽象的(它们完全在子类中实现,基类是空的)。

为了让它编译,我在基类中抛出了一个 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
    }

}

希望这是有道理的

【问题讨论】:

    标签: c# oop virtual abstract


    【解决方案1】:

    将基类标记为抽象,以及没有实现的方法。

    像这样

    public abstract class BaseClass
    {
    
        public abstract void AbstractMethod();
    }
    
    public class SubClass: BaseClass
    {
        public override void AbstractMethod()
        {
            //Do Something
        }
    }
    

    您不能在抽象类之外拥有抽象方法。将类标记为抽象意味着您将无法实例化它。但这没有任何意义。你打算如何处理一个无论如何都不实现方法的类?

    编辑:通过查看您的课程,是的,我会将 PersonComponent 与 UpdatePerson 方法一起抽象化。要么这样,要么如果 UpdatePerson 不为 PersonComponent 做任何事情,请保持原样,但将 PersonComponent 的 UpdatePerson 方法设为空。

    【讨论】:

    • 我已经使用了抽象基类。任何通用代码都可以在基类的受保护(非抽象)方法中调用。 update preson 方法中抛出异常的原因是因为它在实际代码中返回了一些东西并且它不会构建(函数没有返回任何错误)
    【解决方案2】:

    想想你的对象层次结构。您是否想为所有派生类共享公共代码,然后在基类中实现基本功能。

    共享基本代码时,请注意模板模式。使用公共方法并将其链接到具有核心/共享实现的受保护虚拟方法。以“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());
        }
    }
    

    【讨论】:

    • 正是我在 Ta 之后的样子。
    猜你喜欢
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2010-11-22
    • 2014-03-18
    • 2016-12-05
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多