簡體   English   中英

可以將抽象類用作非基類嗎?

[英]Can abstract class be used as non base class?

我是C#編程的新手。 我了解,如果類包含任何抽象方法,則有必要將其修改為抽象類,並且必須在類層次結構中的任何子類中提供其實現。
但是我的問題是我們是否可以有一個沒有任何抽象方法的抽象類(因此它不必成為基類) ,如果是這樣,那么它的意義何在? 請幫助這方面。 :)

是的,您可以有一個沒有任何抽象方法的abstract基類。 好處是您無法創建此類的實例。

考慮使用接口替換該抽象類。 區別在於該接口可能不包含任何實現,但是在抽象類中,您可以為任何繼承者可以使用的方法提供一些實現。

您無法創建抽象類的實例,並且如果您不使用此類作為基礎-它是無用的(僅對於使用反射的一些棘手目標而言可能)

是的,可以在沒有實現子類的情況下使用它。 基本上,這里有三種“方式”來定義和調用方法:

  • static:可以直接在抽象類上調用的方法,因為它們根本不需要實例。
  • 摘要: 必須在子類中實現的方法(請注意,其中一種方法的存在不會阻止您直接使用任何現有的靜態方法!)
  • “常規”:普通方法,直接在抽象類中實現,可以通過子類的實例調用。 請注意,您只能通過子類來調用它們,因為您只能具有子類的實例(而不是抽象類本身)。 根據定義,此類子類還必須實現抽象類中的任何抽象方法(否則,將獲得編譯時錯誤)。

以下簡單的控制台應用程序給出了一個很好的,具體的(無雙關語)示例:

using System;
namespace ConsoleStuff
{
    public abstract class MyAbstractClass
    {
        public abstract void DoSomethingAbs();

        public void DoSomethingElse()
        {
            Console.WriteLine("Do something general...");
        }

        public static void TakeABreak()
        {
            Console.WriteLine("Take a break");
        }
    }

    class MyImplementation : MyAbstractClass
    {
        public override void DoSomethingAbs()
        {
            Console.WriteLine("Do something Specific...");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            // Static method; no instance required
            MyAbstractClass.TakeABreak();

            var inst = new MyImplementation();
            inst.DoSomethingAbs();  // Required implementation in subclass
            inst.DoSomethingElse(); // Use method from the Abstract directly

            Console.ReadKey();
        }
    }
}

暫無
暫無

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

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