抽象类,构造函数和公司

时间:2009-05-01 13:00:04

标签: c# constructor abstract-class

好吧,我正在尝试重用一部分C#代码。它是一个带UDP服务器的抽象类,可以在这里看到:

http://clutch-inc.com/blog/?p=4

我已经创建了一个这样的派生类:

public class TheServer : UDPServer
{
    protected override void PacketReceived(UDPPacketBuffer buffer)
    {
    }

    protected override void PacketSent(UDPPacketBuffer buffer, int bytesSent)
    {
    }
}

在我的应用程序中,我创建了一个派生类的实例,如下所示:

TheServer serv = new TheServer(20501);
serv.Start();

但我有错误,我不明白为什么。请帮忙。

  1. 'TheProject.TheServer'没有 包含一个'1'的构造函数 参数
  2. 'TheProject.UDPServer.Start()'是 由于其保护而无法进入 等级
  3. 'TheProject.UDPServer'确实如此 不包含需要的构造函数 '0'参数

8 个答案:

答案 0 :(得分:13)

构造函数不会在C#中继承。您必须手动链接它们:

public TheServer(int port) 
 : base(port)
{
}

此外,如果Start受保护,则必须创建一种调用它的公共方法:

public void StartServer()
{
    Start();
}

答案 1 :(得分:8)

您的派生类需要添加一个参数构造函数,并将其委托给基类:

 public TheServer(int port) : base(port) {}

此外,Start方法受到保护。你需要自己的:

public void StartMe(){base.Start();}

答案 2 :(得分:2)

这些错误实际上有相当直接的原因:

  1. 您尚未在派生类(TheServer)中定义构造函数。构造函数(当然不同于方法)不会自动继承,因此您需要声明与父类中的构造函数匹配的构造函数,并使用以下内容将它们链接在一起:

    public TheServer(int port) : base(port)
    {
        // Your code here.
    }
    
    public TheServer() : base()
    {
        // Your code here.
    }
    
  2. Start方法在基础(protected)类中声明为UDPServer。将基类中的访问修饰符更改为public,或者在需要时找出从派生类调用方法的方法(后者必须由UDPServer的编写者预期)

  3. 与1相同的原因,除了这是指默认(无参数)构造函数。
  4. 希望有所帮助。

答案 3 :(得分:0)

您没有使用一个参数定义TheServer构造函数,因此您无法调用TheServer(20501);您没有为UDPServer定义零参数构造函数,但您使用一个参数定义了一个。 TheServer中的两个方法都受到保护,因此#2上的错误。

答案 4 :(得分:0)

  1. 和3.
  2. 向调用基础构造函数(UDPServer)的TheServer添加构造函数;像这样的东西:

    public TheServer(int port) : base(port) {}
    

    2 查看方法Start on UDPServer:它受保护。这意味着只有该类的子类可以调用它。

答案 5 :(得分:0)

public class TheServer 
{   
    public TheServer():base(port) {
    }    
}

var myServer = new TheServer(1337).Brings().All().The().Boys().to().The().Yard()

答案 6 :(得分:0)

您需要将代码发布到Abstract类,但需要完全猜测,

您的UDPServer类中有一个ctor未在您的TheServer类中实现...您需要类似......

public TheServer(int port) : base(port)
{
   ... specifics
}

你也忘记了重写TheServer类中的Start()方法 但它在底层类中标记为私有...你的底层类应该有类似......

//In UDPServer
protected void Start()
{
   //Code to start
}

//In TheServer
protected void StartTheServer()
{
   base.Start();
}

答案 7 :(得分:0)

而且,为了它的价值,我建议使用:

UDPServer serv = new TheServer(20501);
serv.start();

或者,甚至更通用的服务器。取决于你需要在serv上调用什么方法。