【问题标题】:how to stop assigning derived class object to base class pointer如何停止将派生类对象分配给基类指针
【发布时间】:2014-09-25 14:54:05
【问题描述】:

我有四个班级:

class Base
{
    public void printf()
    {
        Console.WriteLine("I am from base !!!");
    }
}

class DerivedA : Base
{
    public void printf()
    {
        Console.WriteLine("I am from derived A !!!");
    }
}

class DerivedB : Base
{
    public void printf()
    {
        Console.WriteLine("I am from derived B !!!");
    }
}

class testProgram
{
    public void print(Base baseClass)
    {
        baseClass.printf();
    }
}

我的目标是当我执行以下代码时,在第 4 行它必须给我编译错误。

testProgram tP = new testProgram();
tP.print(baseClass);
tP.print(derivedA);
tP.print(derivedB);

我需要做什么改变?

【问题讨论】:

  • 它与第 3 行有什么区别?
  • 不继承 Base。问题解决了。如果您需要更多帮助,请提供更多信息,但如果派生类无法替代您的基类,您似乎确实存在设计问题。
  • 请包含编译器错误。 “它给了我一个错误”没有帮助。
  • @Gutblender 据我了解,代码没有给出错误,但他想要它。为什么?不知道。
  • 啊,我的错。我看错了。

标签: c# inheritance


【解决方案1】:

通常在编译时你不能真正做到这一点(在运行时很容易做到)。

您可以通过提供显式重载版本来特殊情况下的特定类:

public void print(Base baseClass)...

[ObsoleteAttribute("This method not supported for DerivedB.", true)] 
public void print(DerivedB baseClass) {}

注意:这仅在您在编译时有类型时才有用:

print(new DerivedB()); // error
print((Base)new DerivedB()); // success

【讨论】:

  • 这不会阻止使用被强制转换为 Base 的 DerivedB 实例调用方法。
猜你喜欢
  • 2021-09-09
  • 2014-08-11
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多