为什么没有抽象成员定义C#抽象类

时间:2013-08-07 07:12:24

标签: c# oop design-patterns

熟悉抽象类,接口等。

我不清楚为什么有人会创建一个没有抽象成员的C#抽象类? (C#编译器允许这样做。)

示例:

public abstract class House
{
    public void OpenDoor()
    {
        Console.WriteLine("Door opens");
    }
}

11 个答案:

答案 0 :(得分:4)

您可能需要一个共同的基础来参考,以便您可以处理许多不同类型的房屋清单。您可以拥有List<House>,其中一些可能是BrickHouse其他人WoodenHouse,但打开门的功能与所有房屋相同,因此将方法放在基础中是有意义的。如果实例化该类没有意义,则声明基本抽象。

答案 1 :(得分:2)

只是因为:你应该继承它吗?

也许在这种情况下,House根本不够具体;当然,这种关系中的所有东西都是 house ,但它期待具体的类型,如BungalowMansionApartment等......所以{{ 1}}用作有用的分类(例如,在House或类型为List<House>的属性中) - 但您永远不会期望有一个实际的实例共同基础类型。

答案 2 :(得分:1)

我可以想象某个平台(可能在公司中)可能会定义一个抽象类程序员​​应该是子类,以便可以在以后的版本中添加方法吗?

答案 3 :(得分:1)

只是为他们自动实现内容,例如提供GetHashCodeToString的默认实现。此外,它允许您向抽象类实现的接口添加方法,提供默认实现,然后没有任何中断,而不是每个类中断的其他选项,您必须手动修复所有这些。

答案 4 :(得分:1)

有趣的是,C#中的static classes实际上是sealedabstract。在这种情况下的目的很明确:允许仅声明静态方法。

答案 5 :(得分:0)

概括

抽象类可以是一个概念性的界面&#39;。这与.NET界面不同。 通用接口示例是:

// List that accepts the conceptual interface
List<Car> cars = new List<Car>();

// Specialized instance that will be added to the list
Car myCar = new Toyota();
cars.Add(myCar);

继承

您可以实现多个接口,但只能从一个抽象类继承。这可以是类库开发人员做出的设计决策。

用法

Dhananjay写了一篇关于用法的好文章。他声明抽象类用于建模类层次结构。然而,接口用于通信。对象实际上并不重要。

答案 6 :(得分:0)

这样基类就定义了实现。如果实现在所有派生类中都是通用的,那么将它保留在抽象类中是不合理的,而不是复制派生类中的代码。

查看此链接,有一些有用的信息 http://www.codeproject.com/Articles/6118/All-about-abstract-classes

答案 7 :(得分:0)

抽象类更多地是一个继承的逻辑类,而不是将它作为继承的基础,你可以使用抽象类来告诉所有从中继承的人具有某个属性或特定的方法来做, 接口可以做到这一点。

让我们说我有一个哺乳动物类,但哺乳动物类只是一个抽象类,没有真正的动物是一种哺乳动物,尽管有许多动物(包括人类)继承了“属性”它

同样,抽象使用肯定取决于开发人员的选择。

答案 8 :(得分:0)

具有抽象成员的抽象类旨在以多态方式使用。如果你想与子类共享公共方法,甚至可能是一个特定的构造序列(比如让抽象类的构造函数设置为“housekeeping”),那么只使用具体成员的抽象类。

这是一种比多态子类更弱的耦合形式,我想不出我自己遇到的时间。

答案 9 :(得分:0)

抽象类充当模板(可能提供也可能不提供默认实现),而子可以覆盖他不喜欢的任何东西,或者其他方法/属性等等。

一个非常有趣的场景是类型约束继承:

public abstract class MyClass
{
    public void DoSomething()
    {
        Console.WriteLine("blah blah");
    }
}

public class MyClass<T>: MyClass
{
    public T GetSomething()
    {
        // return null as T;
    }
}

您可能会看到默认实现位于基类。

答案 10 :(得分:0)

基类通常用于提供通用功能。根据您的设计,可以在不依赖于成员的情况下实现此通用功能。在这种情况下,子类通常不需要任何公共成员。在您的示例中,House类对象用于简单操作,我假设您不需要任何常见的房屋状态,例如楼层数,墙壁类型(木材,砖块等)。看到这样的一个类让我觉得“好吧,这个类没有任何状态的对象。它只是执行一些动作”