gpt4 book ai didi

c# - 声明基类错误的类

转载 作者:太空宇宙 更新时间:2023-11-03 10:39:31 25 4
gpt4 key购买 nike

我是 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 扩展到模型)我也想要这种结构。

但是...我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com