我是C#的新手,很抱歉,如果这是一个愚蠢的问题。我从PHP / Java中得到了这个想法。我正在构建一个小型的mvc框架。为此,我们需要一个控制器。但我们有多个控制器,如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);
}
}
在Main-class中,我用这种方式调用方法:
Controller blogs = new BlogsController("Test");
blogs.getData();
即使使用Models(BlogModel扩展到Model),我也想要这个结构。
但是......我在blogs.getData();
收到错误,因为'控制器'没有getData方法。
这是真的,但我想从BlogsController调用getData-method(我使用Controller blogs = new BlogsController("Test");
创建)
我做错了什么?如何使用BlogsController的自定义方法?
感谢您的帮助!
答案 0 :(得分:2)
这是不允许的,因为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
,并且调用是安全的。
答案 1 :(得分:0)
问题是您拥有的基类不包含名为GetData()
方法GetData()
仅适用于您的BlogsController
类...
让我简要介绍一下如何在C#中实现inheritance
和polymorphism
...
void Main()
{
// Car has inherited two properties from the VehicleBase class,
// the Brand propety, and the ProductionDate property
Car car = new Car { Brand = "Foo", ProductionDate = DateTime.UtcNow };
// The StartEngine method is declared in the class `Car`, and is available
// to only its self, as there is no other class inheriting from it.
car.StartEngine();
// This is polymorphism...
VehicleBase vehicle = car;
// As the VehicleBase class doesn't inherit from Car, it can not use
// the StartEngine method... the only way to use it is by casting it
// back to a Car.
Car castedCar = vehicle as Car;
castedCar.StartEngine();
}
public class VehicleBase
{
public string Brand { get; set; }
public DateTime ProductionDate { get; set; }
}
public class Car : VehicleBase
{
public void StartEngine()
{
Console.WriteLine ("Engine started");
}
}