ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 如何确定哪个继承类正在使用抽象类的方法

2019-06-10 19:58:00  阅读:339  来源: 互联网

标签:c oop inheritance abstract-class


在我的控制台应用程序中有一个抽象的Factory类“Listener”,它包含用于侦听和接受连接以及生成客户端类的代码.此类由另外两个类(WorldListener和MasterListener)继承,这些类包含更多特定于协议的覆盖和函数.

我还有一个辅助类(ConsoleWrapper),它封装和扩展System.Console,包含用于写入控制台信息的方法,用于解释WorldListener和MasterListener实例的内容.

我需要一种方法来在抽象的ListenerClass中确定哪个Inheriting类正在调用它的方法.

任何有关此问题的帮助将不胜感激!我很难过:X

我想要做的简化示例.

abstract class Listener
{
   public void DoSomething()
   {
      if(inheriting class == WorldListener)
      ConsoleWrapper.WorldWrite("Did something!");
      if(inheriting class == MasterListener)
      ConsoleWrapper.MasterWrite("Did something!");
   }
}

public static ConsoleWrapper
{
   public void WorldWrite(string input)
   {
       System.Console.WriteLine("[World] {0}", input);
   }
}

public class WorldListener : Listener
{
   public void DoSomethingSpecific()
   {
       ConsoleWrapper.WorldWrite("I did something specific!");
   }
}

public void Main()
{
   new WorldListener();
   new MasterListener();
}

预期产出

[World] Did something!
[World] I did something specific!
[Master] Did something!
[World] I did something specific!

解决方法:

如果您知道要比较的每种类型,请使用is运算符:

if (this is WorldListener)
{
 // ...
}
else if (this is MasterListener)
{
 // ...
}

或者,如果您想要更多灵活性,可以使用GetType:

var type = GetType();
// Do some logic on the type to determine what to do next.

但是,你应该小心这种方法;它通常表明你需要明确检查类型的不良设计(正如这些lovely people坚持的那样).相反,使用多态来将所需行为委托给基类(使用基类中的虚拟或抽象方法)几乎总是更合适 – 毕竟,这就是它的设计目标!

你可以应用这样的多态:

static class Program
{
    static void Main(string[] args)
    {
        Listener listener = new WorldListener();
        listener.DoSomething();
    }
}

abstract class Listener
{
    public void DoSomething()
    {
        var output = Decorate("Did something!");
        ConsoleWrapper.WriteLine(output);
    }

    protected abstract string Decorate(string input);
}

class WorldListener : Listener
{
    protected override string Decorate(string input)
    {
        return string.Format("[World] {0}", input);
    }
}

class MasterListener : Listener
{
    protected override string Decorate(string input)
    {
        return string.Format("[Master] {0}", input);
    }
}

这将产生输出[世界]做了什么!这种方法的优点是,如果你想要添加另一种类型的监听器,只需用适当的Decorate方法为它定义一个新类;没有必要修改Listener本身.

标签:c,oop,inheritance,abstract-class
来源: https://codeday.me/bug/20190610/1213510.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有