我在基类上有一个虚方法。每次我覆盖它,我想返回不同的对象类型。我知道这是不可能的,但处理这种情况的最佳方法是什么?
基本方法示例:
public virtual void clickContinue()
{
//click the continue button
}
覆盖它的方法:
public override myObject clickContinue()
{
//click then continue button
//return myObject
}
我需要做几个类似的覆盖,都返回不同的对象。同样,我知道这可以按照上面的方式完成 - 我试图找出处理这种情况的最佳方法。
答案 0 :(得分:7)
我知道这是不可能的,但处理这种情况的最佳方法是什么?
如果您不需要默认实现,则可以使该类具有通用性,并返回泛型类型:
using Microsoft.Web.WebSockets;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Http;
namespace ChatPractice.Controllers
{
public class ChatController : ApiController
{
public HttpResponseMessage Get(string username, int roomId)
{
HttpContext.Current.AcceptWebSocketRequest(new ChatWebSocketHandler(username, roomId));
return Request.CreateResponse(HttpStatusCode.SwitchingProtocols);
}
}
class ChatWebSocketHandler : WebSocketHandler
{
private static WebSocketCollection _chatClients = new WebSocketCollection();
private string _username;
private int _roomId;
public ChatWebSocketHandler(string username, int roomId)
{
_username = username;
_roomId = roomId;
}
public override void OnOpen()
{
_chatClients.Add(this);
}
public override void OnMessage(string message)
{
var room = _chatClients.Where(x => ((ChatWebSocketHandler)x)._roomId == _roomId);
message = _username + ": " + message;
foreach (var user in room)
user.Send(message);
//_chatClients.Broadcast(_username + ": " + message);
}
}
}
答案 1 :(得分:0)
我感觉到滥用覆盖机制。它背后的想法是你做同样的事情,但有不同的参数。该方法的名称实际上应该告诉你它的作用。那么,同样的程序如何返回void
(不返回任何内容)并且有时会返回一些内容(非void
)?
你确定你不应该有两种完全不同的方法吗?这可能会使API更加清晰。
否则,请考虑始终返回object
,在null
覆盖的情况下(相反),该值始终为void
。
显然,通用方式对于类型安全更好。返回object
表示您放弃键入并手动接管。