簡體   English   中英

無法在接口方法中創建抽象類的實例

[英]unable to create instance of abstract class in interface method

我已經根據提供給我的文檔創建了這個界面。 (我需要使用第三方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)
        {
        }

    }
}

“抽象”一詞意味着您無法創建此類的實例。 您可以創建另一個從抽象類繼承的類,並從子(非抽象)類創建實例。

您的抽象類必須在派生類中實現:

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

MyLoggerImpl是抽象Logger的派生類,可以選擇使用帶有sealed修飾符的MyLoggerImpl來防止其他類繼承:

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參考在這里

控制台應用程序的用法示例:

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

抽象類旨在用作默認行為提供程序,而不是用於實例化。 因此,您需要從抽象類繼承以獲取氏族的默認行為,然后使用特定的行為和狀態擴展繼承的類。

在您的情況下,您將需要創建父抽象類的引用,並實例化自己的繼承類,並將其分配給上面創建的引用。 現在,您可以返回此抽象類引用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM