2016-08-02 54 views
0

我開始學習C#並且無法弄清楚如何從接口方法中調用基類方法。在這種特殊情況下,我需要以某種方式從onRecieve方法中調用sendDataC#調用基於接口方法的方法

WebSocketBase.cs

using WebSocketSharp; 
using System; 
using System.Collections.Generic; 
using System.Threading; 

class WebSocketBase 
{ 
    private WebSocket webSocketClient = null; 
    private WebSocketService webService = null; 
    private string url = null; 

    public WebSocketBase(string url, WebSocketService webService) 
    { 
     this.webService = webService; 
     this.url = url; 
    } 

    public void start() 
    { 
     webSocketClient = new WebSocket(url); 
     webSocketClient.OnError += new EventHandler<WebSocketSharp.ErrorEventArgs>(webSocketClient_Error); 
     webSocketClient.OnOpen += new EventHandler(webSocketClient_Opened); 
     webSocketClient.OnClose += new EventHandler<WebSocketSharp.CloseEventArgs>(webSocketClient_Closed); 
     webSocketClient.OnMessage += new EventHandler<MessageEventArgs>(webSocketClient_MessageReceived); 
     webSocketClient.ConnectAsync(); 
    } 

    private void webSocketClient_MessageReceived(object sender, MessageEventArgs e) 
    { 
     webService.onReceive(e.Data); 
    } 

    public void send(string channel) 
    { 
     webSocketClient.Send(channel); 
    } 

    public void sendData(string data) 
    { 
     send("data"); 
    } 

} 

interface WebSocketService 
{ 
    void onReceive(String msg); 
} 

Logic.cs

class Logic : WebSocketService 
{ 
    public void onReceive(string msg) 
    { 
     Console.WriteLine("Received message") 
    } 
} 
+0

此代碼中沒有'WebSocketBase'的實例。你需要有一個給定對象的實例來調用該對象的方法。 – David

+0

在你的例子中,'Logic'類只實現了接口,而不是'WebSocketBase'。如果你不是從一個基類繼承,你怎麼能調用一個基類? – Louis

+0

你介意提供一個完整的例子嗎?這似乎錯過了代碼的一部分(例如,你使用的「webService」對象從哪裏來的?) –

回答

1

因此,它看起來像你的WebSocketBase對服務的依賴。爲什麼不讓服務知道WebSocketBase正在發送消息?

interface WebSocketService 
{ 
    void onReceive(WebSocketBase sender, String msg); 
} 

class Logic : WebSocketService 
{ 
    public void onReceive(WebSocketBase sender, string msg) 
    { 
     sender.send("blah"); 
    } 
} 

class WebSocketBase 
{ 
    ... 

    private void webSocketClient_MessageReceived(object sender, MessageEventArgs e) 
    { 
     webService.onReceive(this, e.Data); 
    } 

    public void send(string channel) 
    { 
     webSocketClient.Send(channel); 
    } 

    ...  
} 
+0

謝謝!有用 –

3

也許這並不是你的意圖(評論,我會編輯),但我最簡單的事情將是擴展基類型和實現你的接口。

class Logic : WebSocketBase, WebSocketService 
{ 
    public void onReceive(string msg) 
    { 
     Console.WriteLine("Received message") 

     // Call method defined in base 
     sendData(msg); 
    } 
} 
2

正如其他評論所指出的那樣,您沒有對WebSocketBase類做任何事情。

一些其他風格要點:
一)WebSocketService應該是「IWebSocketService」按照慣例
b)若WebSocketBase的唯一目的是成爲一個基類,你應該讓抽象
C)一定要標記您班並與訪問修飾符接口本身太(不只是在他們裏面的方法)

public interface IWebSocketService 
{ 
    void onReceive(String msg); 
} 

public abstract class WebSocketBase : IWebSocketService 
{ 

... 


private void webSocketClient_MessageReceived(object sender, MessageEventArgs e) 
{ 
    webService.onReceive(e.Data); 
} 

    public void sendData(string data) 
    { 
     send("data"); 
    } 

} 

public class Logic : WebSocketBase 
{ 
    public void onReceive(string msg) 
    { 
     Console.WriteLine("Received message") 
    } 
}