2014-09-22 82 views
2

我是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

回答

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和通話是安全的每一個類。

+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

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

明天我會檢查一下。感謝您的回答;) – Bob 2014-09-22 22:18:51