声明基类错误的类

问题描述:

我是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的自定义方法?

感谢您的帮助!

+3

如果您想使用特定于“BlogsController”的任何内容,则需要该类型的引用。 – 2014-09-22 21:21:34

+1

或者将其作为'abstract'方法添加到抽象类中。一种方式或其他。对Controller的引用将永远无法访问派生的方法。 – BradleyDotNET 2014-09-22 21:22:34

+0

@BrianRasmussen我知道,但我给它类型'Controller',因为'BlogsController''扩展'到'Controller' – Bob 2014-09-22 21:23:02

这是不允许的,因为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和通话是安全的每一个类。

+0

嘿,谢谢你的明确解释。你会如何建议解决这个问题。是否有必要从'Controller'派生?你将如何建立这种mvc-框架? – Bob 2014-09-22 21:36:41

+0

'Controller'不是问题,真正的问题是'getData'的效用是什么?对于Controller的每个实现或者仅仅是一个实现会很重要吗?这个问题的答案决定了正确的解决方案。如果这仍然让你感到困惑,或许我们应该聊聊OOP设计? – BradleyDotNET 2014-09-22 21:38:15

+0

我们如何聊天? ;)我可以告诉你我真正的问题吗? (这个例子是一个例子) – Bob 2014-09-22 21:40:06

的问题是,你有没有包含该方法的基类叫做GetData()

方法GetData()仅提供给您的BlogsController类...

让我给你一个简短的介绍如何在C#中实现inheritancepolymorphism ...

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"); 
    } 
} 
+0

明天我会检查一下。感谢您的回答;) – Bob 2014-09-22 22:18:51