![](/img/trans.png)
[英]Cannot create an instance of the abstract class or interface, but it is not an abstract class and it's not an interface?
[英]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.