声明基类错误的类
我是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);
}
}
在主I类调用的方法是这样的:
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
和通话是安全的每一个类。
嘿,谢谢你的明确解释。你会如何建议解决这个问题。是否有必要从'Controller'派生?你将如何建立这种mvc-框架? – Bob 2014-09-22 21:36:41
'Controller'不是问题,真正的问题是'getData'的效用是什么?对于Controller的每个实现或者仅仅是一个实现会很重要吗?这个问题的答案决定了正确的解决方案。如果这仍然让你感到困惑,或许我们应该聊聊OOP设计? – BradleyDotNET 2014-09-22 21:38:15
我们如何聊天? ;)我可以告诉你我真正的问题吗? (这个例子是一个例子) – Bob 2014-09-22 21:40:06
的问题是,你有没有包含该方法的基类叫做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");
}
}
明天我会检查一下。感谢您的回答;) – Bob 2014-09-22 22:18:51
如果您想使用特定于“BlogsController”的任何内容,则需要该类型的引用。 – 2014-09-22 21:21:34
或者将其作为'abstract'方法添加到抽象类中。一种方式或其他。对Controller的引用将永远无法访问派生的方法。 – BradleyDotNET 2014-09-22 21:22:34
@BrianRasmussen我知道,但我给它类型'Controller',因为'BlogsController''扩展'到'Controller' – Bob 2014-09-22 21:23:02