c# - 声明基类出错的类

标签 c# polymorphism

我是 C# 新手,如果这是一个愚蠢的问题,我很抱歉。我从 PHP/Java 得到了这个想法。我正在构建一个小型 mvc 框架。为此我们需要一个 Controller 。但是我们有多个 Controller ,例如 PlayerController、CarController、BombController...所有这些模型都扩展为 Controller 类。

示例:

public abstract class Controller
{

    public string data;

    public Controller(string data) {
        this.data = data;
    }

}

还有:

class BlogsController : Controller
{

    public BlogsController(string data) : base(data)
    {
    }

    public void getData()
    {
        Console.WriteLine(this.data);
    }

}

在主类中,我这样调用方法:

Controller blogs = new BlogsController("Test");

blogs.getData();

即使有模型(BlogModel 扩展为 Model),我也想要这种结构。

但是...我在 blogs.getData(); 上收到错误,因为“Controller”没有 getData 方法。 确实如此,但我想从 BlogsController 调用 getData 方法(我使用 Controller blogs = new BlogsController("Test"); 创建的)

我做错了什么?如何使用 BlogsController 的自定义方法?

感谢您的帮助!

最佳答案

这是不允许的,因为 Controller 不包含名为 getData 的方法。假设您编写以下内容:

public class MyController : Controller
{
    public MyController (string data) : base(data)
    {
    }
}

完全合法。现在让我们使用它!

Controller blogs = new MyController ("Test");

blogs.getData(); //Whoops!

blogs 没有定义方法getData!此行为并非 C# 特有,在任何强类型 OOP 语言中都是相同的。这会起作用:

Controller blogs = new BlogsController("Test");

(blogs as BlogsController).getData(); //Better....

但如果您没有实际实例化 BlogsController ,则会抛出异常,因为转换将会失败。

你确实有两个解决方案,持有一个派生类引用,这样只有特定的派生类才能分配给它;或者,使 getData 成为您的“界面”的一部分:

public abstract class Controller
{

    public string data;

    public Controller(string data) {
        this.data = data;
    }

    public abstract void getData();
}

还有:

class BlogsController : Controller
{

    public BlogsController(string data) : base(data)
    {
    }

    public override void getData()
    {
        Console.WriteLine(this.data);
    }

}

现在,从 Controller 派生的每个类都必须实现 getData 并且调用是安全的。

关于c# - 声明基类出错的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25983277/

相关文章:

c++ - 为什么 'Base Class object' 不能调用它自己的虚函数? C++

c++ - 编译器是否优化了虚拟调用?

c++ - 具有数字集 C++ 的多态性中的内存泄漏

c# - 防止 ASP.Net 中的重复回发 (C#)

c# - XElement - 如何将元素的后代放入字符串中

c# - HttpWebRequest 在授权 header 中发送无参数 URI

java - 如何在ArrayList中使用多态性?

Java 字符串排序错误

c# - 将 .NET 与 nodejs(加密)进行比较时哈希值不同

c# - Server.MapPath 不返回映射到 Web-App 子文件夹中的虚拟目录的正确物理路径