声明基类出错的类

时间:2014-09-22 21:19:24

标签: c# polymorphism

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

感谢您的帮助!

2 个答案:

答案 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#中实现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");
    }
}
相关问题