从抽象类继承的类要求方法具有相同的签名

本文关键字:继承 抽象类 方法 | 更新日期: 2023-09-27 18:11:54

我对最近遇到的一些代码有点困惑。下面是一个片段。首先是抽象类定义,然后是继承它的类:

public abstract class BaseClass
{
    protected static void MapEntityToModel(string paramOne, List<TypeDef> types)
    {
        // Some Logic Here
    }
    protected static void MapModelToEntity(ModelType model, ResultType result)
    {
        // Some Logic Here
    }
} 
public class BaseExtension : BaseClass
{
    public static ViewModel MapModelToViewModel(Model m)
    {
        var result = new ViewModel();
        // Some Logic Here
        return result;
    }
    public static List<ViewModel> MapModelsToViewModels(List<TModel> models)
    {
        return models.Select(m => MapModelToViewModel(m)).ToList();
    }
    public static Model MapViewModelToModel(ViewModel v)
    {
        var result = new Model();
        // Some Logic Here
        return result;
    }
}

所以我对抽象类的理解和使用一直是抽象类中的任何抽象方法都必须在继承的类中被重写。如果抽象类中的方法没有被声明为抽象,则派生类可以在方法中创建自己的实例,并直接调用抽象类的非抽象方法。

但是在这两种情况下,抽象类的方法都在派生类中使用。但是,根据前面的代码片段,派生类没有直接映射的签名或用法。

那么抽象类在这种特殊情况下的目的是什么?为什么它编译没有错误?

从抽象类继承的类要求方法具有相同的签名

所以我对抽象类的理解和使用一直是抽象类中的任何抽象方法都必须在继承的类中被重写

这是对的,但是方法不是抽象的,它们是具体的(和静态的)。只有虚拟或抽象实例方法可以被重写。

那么抽象类在这种特殊情况下的目的是什么?为什么它编译没有错误?

由于类没有抽象方法或属性,我不明白为什么它是抽象的,除了作者没有创建实例出于某种原因。

静态方法不是类实例的一部分

当你说一个类是抽象的,你是在说你不能创建它的实例。

这些类的抽象除了强调创建它们的实例是毫无意义的之外,没有任何意义,因为所有的方法都是静态的。

从它们继承似乎有点无意义,因为没有继承任何东西——所有成员都是静态的。您也可以只继承类,并使基类为空接口,并将其中的静态方法移动到继承类中(接口实际上是一个没有方法实现的抽象类-但您通常会拥有实际上是抽象方法定义的东西)

abstract class a
{
    public  abstract string look();
    public static string lookStatic()
    {
        return "look";
    }
}
class b : a
{
    public override string look()
    {
        return "look member";
    }
}
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(b.lookStatic());
        var test = new b();
        Console.WriteLine(test.look());
        var c = (a) test;
        Console.WriteLine(c.look());
        Console.ReadLine();
    }
}