2016-08-02 33 views
0

Ich fange an, C# zu lernen und kann nicht herausfinden, wie die Basisklassenmethode innerhalb der Interface-Methode aufgerufen wird. In diesem speziellen Fall muss ich irgendwie sendData von innerhalb onRecieve Methode anrufen.C# Calling-Base-Methode von der Schnittstellenmethode

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

Es gibt keine Instanz von 'WebSocketBase' in diesem Code. Sie benötigen eine Instanz eines bestimmten Objekts, um eine Methode für dieses Objekt aufzurufen. – David

+0

In Ihrem Beispiel implementiert die 'Logic' Klasse nur die Schnittstelle, nicht die' WebSocketBase'. Wie können Sie eine Basisklasse aufrufen, wenn Sie nicht von einer erben? – Louis

+0

Hätten Sie etwas dagegen, ein vollständiges Beispiel zu geben? das scheint einen Teil des Codes zu vermissen (wie kommt das "webService" -Objekt, das du benutzt, her?) –

Antwort

1

So sieht es aus wie Ihre WebSocketBase eine Abhängigkeit von der Service. Warum sollte der Dienst nicht wissen, was WebSocketBase ihm Nachrichten schickt?

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

danke! Es klappt –

3

Vielleicht war dies nicht Ihre Absicht (Kommentar und ich bearbeiten), aber ich würde die einfachste Sache zu verlängern sein der Basistyp UND implementieren Sie Ihre Schnittstelle.

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

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

Wie schon in anderen Kommentaren angezeigt, tun Sie nicht mit der WebSocketBase Klasse nichts.

Einige andere stilistische Punkte:
a) WebSocketService sollte „IWebSocketService“ vereinbarungs
b) Falls alleinigen Zweck der WebSocketBase ist eine Basisklasse sein, Sie es Ihre abstrakten
c) Stellen Sie sicher machen sollte markieren auch Klassen und sich Schnittstellen mit Zugriffsmodifikatoren (nicht nur die Methoden in ihnen)

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") 
    } 
}