asp.net 无法在接口方法中创建抽象类的示例

umuewwlo  于 2023-03-31  发布在  .NET
关注(0)|答案(4)|浏览(218)

我已经根据给我的文档创建了这个接口。(我需要使用第三方API进行数据库日志记录)。我希望返回getLogger()方法的对象类型“Logger”和getDatabaseMgr方法的对象类型“DatabaseMgr”。然而,这些都是抽象类。文档没有指定该方法做什么,他们只是写了{...}。
如果我不能创建这些类的示例,那么我如何返回它们?

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)
        {
        }

    }
}
3bygqnnd

3bygqnnd1#

“abstract”这个词意味着你不能创建这个类的示例。你可以创建另一个继承自抽象类的类,并从子类(非抽象类)创建示例。

yzxexxkh

yzxexxkh2#

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

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);
    }
}

现在在另一个类MyLogger中创建MyLoggerImpl的示例:我更倾向于将debug()创建为static,这样无论创建了多少个类的示例,static成员都只存在一个副本,也避免了从不同的代码模块多次创建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.");
}
vulvrdjw

vulvrdjw3#

抽象类是用来作为默认的行为提供者,而不是用来示例化的。所以你需要从抽象类中继承,得到氏族的默认行为,然后用特定的行为和状态扩展你继承的类。
在你的例子中,你需要创建一个父抽象类的引用,示例化你自己的继承类,并把它赋值给上面创建的引用。现在你可以返回这个抽象类引用了。

xkftehaa

xkftehaa4#

对于.NET Core 3.1,您可以使用System.Reflection
将构造函数添加到记录器:

public abstract class Logger
{
    public Logger() { }
    public String Id { get; set; }
    public abstract void trace(String message);
    ...
    ...
    public abstract bool isWarnEnabled { get; }
    public abstract bool isErrorEnabled { get; }
}

使用反射获取示例:

Type typeLogger = typeof(Logger);
ConstructorInfo magicConstructor = typeLogger.GetConstructor(Type.EmptyTypes);//get Constructor

Type TypeRuntimeMethodHandle = typeof(RuntimeMethodHandle);
MethodInfo magicMethod = TypeRuntimeMethodHandle.GetMethod("InvokeMethod", BindingFlags.Static | BindingFlags.NonPublic);//get InvokeMethod from RunTimeMethodHandle

PropertyInfo sigInfo = magicConstructor.GetType().GetProperty("Signature", BindingFlags.Public | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Instance);//get signature
Logger abstrObj = (Logger)magicMethod.Invoke(null, new object[] { null, null, sigInfo.GetValue(magicConstructor), true , null});

abstrObj.Id = "2366";
Console.WriteLine(abstrObj.Id);
Console.WriteLine(abstrObj.GetType().ToString());

来源:https://github.com/FORzzMOK/Creating-an-abstract-class

相关问题