Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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#_.net_Inheritance_Abstract - Fatal编程技术网

C# 从非抽象类派生抽象类

C# 从非抽象类派生抽象类,c#,.net,inheritance,abstract,C#,.net,Inheritance,Abstract,从非抽象类派生抽象类可以吗?或者这种方法有什么问题吗 这里有一个小例子: public class Task { // Some Members } public abstract class PeriodicalTask : Task { // Represents a base class for task that has to be done periodicaly. // Some additional Members } public class DailyTask

从非抽象类派生抽象类可以吗?或者这种方法有什么问题吗

这里有一个小例子:

public class Task {
  // Some Members
}

public abstract class PeriodicalTask : Task {
  // Represents a base class for task that has to be done periodicaly.
  // Some additional Members
}

public class DailyTask : PeriodicalTask {
  // Represents a Task that has to be done daily.
  // Some additional Members
}

public class WeeklyTask : PeriodicalTask {
  // Represents a Task that has to be done weekly.
  // Some additional Members
}

在上面的例子中,我不想让类任务抽象,因为我想直接实例化它。PeriodicalTask应该继承Task的功能并添加一些其他成员,但我不想直接实例化它。应该只实例化PeriodicalTask的派生类。

在这里使用抽象不是正确的方法,例如,使用受保护的构造函数或内部构造函数。这将阻止直接创建PeriodicalTask的实例,但其派生类仍然可以访问它。

没有问题

如果您查看像WinForms这样的大型层次结构,您将发现抽象类型的几个层次


MSBuild任务也是一个很好(而且更相关)的例子。

我认为这种方法没有任何错误

您可能有一些可以用具体术语描述的基本类型。现在,仅仅因为这种类型的对象可以根据某些子类型进一步分类,并不意味着所有这些子类型都是具体的;反过来,它们可能需要进一步的混凝土化

现实世界的例子:

——具体(非抽象)
兄弟姐妹:人
--摘要
兄弟姐妹
--具体

Sister:Sibling
--concrete

这种事情一直在发生:所有抽象类都继承自
System.Object
,一个本身不是
抽象的类


new System.Object()
有时用于锁定,如果您周围没有其他东西,可以锁定。

您能详细说明一下吗?是的,受保护/内部构造函数可以阻止创建
PeriodicalTask
的实例。但它也需要从
Task
中提取任何抽象方法/属性才能实现。。。我错过了那个不是抽象的任务。在这种情况下,两种方法都同样有效。除此之外,您不能强制某人在派生类中实现方法。@kprobst:是的,我可以这样做,但这样我就无法定义抽象成员,这些成员必须由派生类型实现。虚拟成员是没有选择的,因为派生类型必须定义它们的工作方式。我忽略了这一事实,因为继承自System.Object不能设置为显式。您还可以使用
抽象方法重写具体(但虚拟)方法。示例
公共抽象重写字符串ToString()
使用一个
摘要
覆盖来自
System.Object
的具体
ToString()
。这迫使所有派生类提供一个新的实现!