C#重写方法并返回不同的对象

时间:2015-05-18 22:21:12

标签: c#

我在基类上有一个虚方法。每次我覆盖它,我想返回不同的对象类型。我知道这是不可能的,但处理这种情况的最佳方法是什么?

基本方法示例:

public virtual void clickContinue() 
{
    //click the continue button
}

覆盖它的方法:

public override myObject clickContinue()
{
    //click then continue button
    //return myObject
}

我需要做几个类似的覆盖,都返回不同的对象。同样,我知道这可以按照上面的方式完成 - 我试图找出处理这种情况的最佳方法。

2 个答案:

答案 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表示您放弃键入并手动接管。