我是 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/