无法在接口方法中创建抽象类的实例

时间:2015-12-23 17:14:35

标签: c# asp.net abstract-class

我根据给我的文档创建了这个界面。 (我需要使用第三方API进行数据库日志记录)。 我应该返回对象类型" Logger"对于getLogger()方法和对象类型" DatabaseMgr"对于getDatabaseMgr方法。但是,这些是抽象类。文档没有说明方法的作用,只是写了{...}。

如果我无法创建这些类的实例,那么我该如何返回它们呢?

using System;
using System.Data.Common;

namespace com.XXXXXXXXXX.api
{
    public class ApiFactory
    {
        public static ApiFactory getInstance() {
            return new ApiFactory();
        }


        public Logger getLogger(String Id, Type type)
        {
        }

        public DatabaseMgr getDatabaseMgr(String Id)
        {
        }

    }
    public abstract class Logger
    {
        public String Id { get; set; }
        public abstract void trace(String message);
        public abstract void debug(String message);
        public abstract void info(String message);
        public abstract void warn(String message);
        public abstract void error(String message);
        public abstract void alert(String message);
        public abstract bool isTraceEnabled { get; }
        public abstract bool isDebugEnabled { get; }
        public abstract bool isInfoEnabled { get; }
        public abstract bool isWarnEnabled { get; }
        public abstract bool isErrorEnabled { get; }
    }
    public abstract class DatabaseMgr
    {
        public String Id { get; set; }

        protected DatabaseMgr(String Id)
        {
        }

    }
}

3 个答案:

答案 0 :(得分:10)

" abstract"意味着您无法创建此类的实例。 您可以创建另一个继承自抽象类的类,并从子(非抽象)类创建实例。

答案 1 :(得分:2)

您的抽象类必须在派生类中实现:

public abstract class Logger
{
    public abstract void debug(String message);
    //Other properties and methods
}

MyLoggerImpl是抽象Logger的派生类,可选地应用MyLoggerImplsealed修饰符来阻止其他类继承:

public sealed class MyLoggerImpl : Logger
{
    public override void debug(string message) 
    {
        //Write log
        //Trace.WriteLine(message);
    }
}

现在在另一个班级MyLoggerImpl中创建MyLogger的实例:我更喜欢将debug()创建为static,以便只有static的一个副本{ {1}}成员存在,无论创建了多少个类实例,还避免从不同的代码模块中多次创建MyLogger的实例,而是可以调用MyLogger.debug("Some message.")

public class MyLogger
{
    public static void debug(string message)
    {
        var log = new MyLoggerImpl();
        log.debug(message);
    }
}

MSDN参考是here

来自控制台应用程序的示例用法:

static void Main(string[] args)
{
    MyLogger.debug("Some message.");
}

答案 2 :(得分:0)

抽象类旨在用作默认行为提供程序,而不是用于实例化。所以你需要从抽象类继承获得该族的嘲讽行为,然后用特定的行为和状态扩展你的继承类。

在您的情况下,您需要创建父抽象类的引用并实例化您自己的继承类并将其分配给上面创建的引用。现在您可以返回此抽象类引用。