【问题标题】:Abstract and virtual functions抽象和虚函数
【发布时间】:2016-11-29 14:38:58
【问题描述】:

我正在尝试实现两级继承。目前,有一个抽象类和一个继承类:

public abstract class A
{
    public abstract void func();
}

public class B : A
{
    public override void func()
    {
        .......
    }
}

我想创建 B 类的两个专用实例,但我希望 A 类公开这些函数。我打算这样做,

public abstract class A
{
    public abstract void func();
}

public class B : A
{
    public virtual void func();
}

public class C : B
{
    public override void func()
    {
         ........
    }
}

public class D : B
{
    public override void func()
    {
         ........
    }
}  

这个实现是错误的,但这是我的意图。我将如何实现它?

【问题讨论】:

  • class B 是否应该实现func()
  • 实际上 B 类没有实现 func()。我会更新问题。
  • 如果它没有实现并且您没有提供“空”实现,那么 class B 也是抽象的(这很好,除非您需要能够创建具体的 @ 987654326@).
  • B 类有其他实现的函数(重写函数)
  • 考虑throw NotImplementedException(); 用于B 中的方法。但最好改成B abstract

标签: c# oop inheritance virtual abstract


【解决方案1】:

你可以像这样使用接口代替抽象类A:

public interface A
{
    void func();
}
public abstract class B: A
{
    public abstract void func();
}
public class C : B
{
    public override void func()
    {
        throw new NotImplementedException();
    }
}
public class D : B
{
    public override void func()
    {
        throw new NotImplementedException();
    }
}

也许对你有帮助。

【讨论】:

  • 您假设 OP 不想实例化并将 B 类用于其他潜在的属性/方法。
  • @AshwinNair:我听不懂,请解释一下你的担忧?
  • 我的意思是你假设 OP 不想使用:var b = new B();
  • 我无法将 A 类更改为接口,因为这都是工厂模式的一部分。工厂类返回泛型 A 类对象。
【解决方案2】:

你不能有没有实现的虚方法,所以你应该把B抽象类,这应该会让编译器高兴:

public abstract class B : A
{
}

另一种方法是为函数func添加空方法体:

public class B : A
{
    public virtual void func()
    {
        // function has empty method body
        // it does not do anything, but you can override functionality in derived classes
    }
}

【讨论】:

  • 我添加了返回类型。我们可以覆盖一个被覆盖的函数吗?
  • @sethu 是的,你可以。抽象、虚拟或被覆盖的函数都可以在派生类中被覆盖
  • 如果我对一个被覆盖的函数使用覆盖(B 类有公共覆盖 void func())。在那种情况下,被覆盖的函数(C 和 D 中的函数)永远不会被调用。仅触发 B 类中的函数。
  • 成功了!我只需要创建该特定类型的对象。
猜你喜欢
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2013-05-13
  • 2019-04-08
  • 2023-03-14
  • 2011-09-28
  • 2013-01-15
相关资源
最近更新 更多