Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 抽象类与非抽象类派生的区别_C#_Oop - Fatal编程技术网

C# 抽象类与非抽象类派生的区别

C# 抽象类与非抽象类派生的区别,c#,oop,C#,Oop,在OOP中,我看到很多类都是从父类派生的,但是父类没有标记为抽象类。当类被标记为抽象时,这有什么好处 感谢抽象类本身无法实例化;它必须从中派生才能实例化。从本质上讲,类的抽象定义表明它不打算被实例化为自身,而获取其实例的唯一方法是从该类继承,并实例化继承的类。抽象类不能被自身实例化;它必须从中派生才能实例化。从本质上讲,类的抽象定义表明它不打算被实例化为自身,而获取它的实例的唯一方法是从该类继承,并实例化继承的类。编译器不允许您实例化它的事实?编译器不允许您实例化它的事实?区别真的很实用:抽象基

在OOP中,我看到很多类都是从父类派生的,但是父类没有标记为抽象类。当类被标记为抽象时,这有什么好处


感谢

抽象类本身无法实例化;它必须从中派生才能实例化。从本质上讲,类的抽象定义表明它不打算被实例化为自身,而获取其实例的唯一方法是从该类继承,并实例化继承的类。

抽象类不能被自身实例化;它必须从中派生才能实例化。从本质上讲,类的抽象定义表明它不打算被实例化为自身,而获取它的实例的唯一方法是从该类继承,并实例化继承的类。

编译器不允许您实例化它的事实?

编译器不允许您实例化它的事实?

区别真的很实用:抽象基类是永远不会被实例化的,因此不必提供完整的实现。这意味着ABC可以为派生类定义契约,而无需实现该类

这在两个方面很方便:

  • 您可以定义没有完整实现但对整个类进行断言的抽象对象。其中的一个例子是使用一个DrawItem类和一个
    draw()
    方法,该方法是Circle、Rectangle等的基类。DrawItem不知道如何绘制自己,因为它不知道它是什么

  • 您可以定义有两个具体实现的类。这将显示在代理模式中,并且还可以用于构建(例如)用于测试的模拟对象


现在,新语言为这些东西定义接口、模块或混音更为常见;事实证明,对于那些更直观的概念,使用ABC几乎总是属于用例。

区别确实非常实用:抽象基类是一个永远不会被实例化的类,因此不必提供完整的实现。这意味着ABC可以为派生类定义契约,而无需实现该类

这在两个方面很方便:

  • 您可以定义没有完整实现但对整个类进行断言的抽象对象。其中的一个例子是使用一个DrawItem类和一个
    draw()
    方法,该方法是Circle、Rectangle等的基类。DrawItem不知道如何绘制自己,因为它不知道它是什么

  • 您可以定义有两个具体实现的类。这将显示在代理模式中,并且还可以用于构建(例如)用于测试的模拟对象

现在,新语言为这些东西定义接口、模块或混音更为常见;事实证明,使用ABC几乎总是属于那些更直观概念的用例。

Paul Haahr有,例如:

不要将具体类划分为子类

(阅读原文,我不想复制和粘贴所有内容;-)

<保罗>关于java的文章,但我发现他的建议至少适用于大多数的任何面向对象设计任务(尽管在编码上我仍然偶尔偏离它,它在我的设计中是活的,而且很好的);即使我在C++、Python或任何东西中实现它。如果在阅读了Paul的推理之后,您发现自己同意他的观点,那么将来您将使用更多的抽象类(以允许子类化;-)。

Paul Haahr有,例如:

不要将具体类划分为子类

(阅读原文,我不想复制和粘贴所有内容;-)


<保罗>关于java的文章,但我发现他的建议至少适用于大多数的任何面向对象设计任务(尽管在编码上我仍然偶尔偏离它,它在我的设计中是活的,而且很好的);即使我在C++、Python或任何东西中实现它。如果在阅读了Paul的推理之后,你发现自己同意他的观点,那么将来你将使用更多的抽象类(允许子类化;-)。

举一个我认为相关的例子:

public abstract class CustomSocket()
{
    CustomSocket()
    {
    }

    public abstract void PleaseOverideMe(CustomSocketConnection c)
    {

    }

}

举一个我认为相关的例子:

public abstract class CustomSocket()
{
    CustomSocket()
    {
    }

    public abstract void PleaseOverideMe(CustomSocketConnection c)
    {

    }

}
将一个类称为“抽象”本质上是向您的程序员同伴传达它是不完整的:他们需要编写更多的代码才能利用它

在函数式编程中,函数的部分应用实际上是并行的…

调用类“抽象”本质上是向您的程序员同伴传达它是不完整的:他们需要编写更多的代码才能利用它


在函数编程中,函数的部分应用实际上是并行的…

这就像说-iv'e走到这一步-这完全取决于你自己!(现在我明白你的经期了。)这就像说——我们走到这一步——这完全取决于你自己!(现在我明白你的经期了。)