Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/280.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/3/gwt/3.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#_Inheritance_Interface_Subclass_Base Class - Fatal编程技术网

C# 我不知道';我不理解基类的继承

C# 我不知道';我不理解基类的继承,c#,inheritance,interface,subclass,base-class,C#,Inheritance,Interface,Subclass,Base Class,我对继承的理解是相当基本的 我想创建一个基类,它实现了IDisposable,然后让其他具有功能的类从该基类继承,以便它们共享一个基类类型 这将允许我把每一个对象放在一个列表中,这样当我想清理的时候,我可以一次性处理掉所有的东西。 问题是,C#中的类只能继承一次,否则只能使用接口 现在,像Thread这样的类如何从我的基类继承而不必重新编写Thread类 这听起来可能很愚蠢,但简而言之:我想让已经存在的类继承我选择的基类,而不会失去它的功能。(这样,项目中使用的所有类都有一个共同的基础,可以归纳

我对继承的理解是相当基本的

我想创建一个基类,它实现了
IDisposable
,然后让其他具有功能的类从该基类继承,以便它们共享一个基类类型

这将允许我把每一个对象放在一个列表中,这样当我想清理的时候,我可以一次性处理掉所有的东西。 问题是,C#中的类只能继承一次,否则只能使用接口

现在,像
Thread
这样的类如何从我的基类继承而不必重新编写
Thread

这听起来可能很愚蠢,但简而言之:我想让已经存在的类继承我选择的基类,而不会失去它的功能。(这样,项目中使用的所有类都有一个共同的基础,可以归纳为一种对象类型,例如
List


这可能吗?

如果您的目标只是存储一个可以处置的对象列表,那么您需要一个
列表。直接或间接实现该接口的任何类都可以存储在其中

var disposables = new List<IDisposable>();
disposables.Add(new MyClass1());
disposables.Add(new SomeClass());
disposables.Add(new AnotherClass());

disposables.ForEach(d => d.Dispose());
var disposables=新列表();
添加(新MyClass1());
添加(newsomeclass());
添加(新的另一个类());
一次性使用。ForEach(d=>d.Dispose());

这是否是一个值得的模式,我不相信

您给出的invlolves接口示例
IDisposable
。在C#中,类可以实现多个接口

另一方面,在C中,类可以从继承一个类

尽管如此,从类继承并不总是一个好主意,因为它非常有限。相反,我建议组成:

例如,我建议使用合成设计模式(这是一个小的变化,因为合成没有对象集合,而只有一个对象):

编辑

重新思考问题后,您似乎希望将一些对象集(不同类)放入列表中,以便可以对列表中的每个对象执行一些定义的操作

最简单的方法是:使用定义的操作定义接口:

public interface IMyIntf
{
    void MyDesiredAction();
}
现在,让所有类都实现它。现在你可能会想“好吧,现在我需要在任何地方都实现这个方法…”-不是这样的!只需使用适配器设计模式,例如,拥有类:

public class MyConcreteClass
{
    public void ActionIWishToExecuteOnThisObject() 
    { ... }
}
您只需将其修改为:

public class MyConcreteClass : IMyIntf
{
    public void ActionIWishToExecuteOnThisObject() 
    { ... }

    // implement interface
    public void MyDesiredAction()
    {
        ActionIWishToExecuteOnThisObject();
    }
}
现在,您可以使用一些聚合,如
列表
,将所有感兴趣的对象放在那里,然后执行以下操作:

foreach(var item in myList)
    item.MyDesiredAction();

类可以继承自祖先类(else对象,所有对象的根)

它还可以实现一些接口(或不实现)

类可以具有抽象的未实现成员,因此该类是抽象的

此外,成员可以是虚拟的,以启用多态性(抽象成员是虚拟的)

一旦实现,类中的一个东西是可用的,即使不是抽象的,也可以被实例化为真实的,并且对所有的子类也是可用的,除了隐藏在子类中的私有的子类

无需重复,这是OOP的强大功能之一

这样做,通过抽象、封装、继承和多态性,在研究了现实世界和我们工作的领域之后,我们可以设计一个现实世界的投影,一个在我们头脑中的视图,概念有数据(字段和属性)和操作(方法),分类为工件(对象)和关系、组合等,聚合、接口、组件、控件等

因此,我们可以将处理分解为不重复,例如:

  • 拥有
    动物
    类和
    子类
  • 我们在动物中加入了
    大小
    颜色
    方面
  • 以及对所有动物实施的
    Eat
    Walk
    方法
  • 和一个抽象的未实现的
    DoSound
因此:

  • 在具体的类中,
    Cat
    Dog
    我们不再实现这些东西
  • 除了对每种真实动物的性别都有特别的
    DoSound
关于接口,它们是虚拟合同

例如,乍一看,我们可以让动物和建筑毫无共同之处(我们不会再回到原子和光子),但我们希望能够管理像猫和狗这样的对象实例,以及房屋和博物馆来拍照

为了实现我们定义了一个接口
iphototake
,在定义以前的类时,我们添加了它们实现这个接口

代码示例:

public interface IPhotoTaking
{
  Image TakePhoto();
}
现在有了这个列表,我们可以使用这样的多态性:

var animals = new List<Animal>();

foreach ( var animal in animals )
  animal.DoSound();
var items = new List<IPhotoTaking>();

foreach ( var item in items )
  item.TakePhoto();
var动物=新列表


问题是,C#中的类只能继承一次,否则只能使用接口-谁告诉你的?继承树的深度没有实际限制。我想让已经存在的类继承我选择的基类——你写了这些“已经存在”的类吗?像Thread这样的类怎么能从我的基类继承而不需要我对Threadclass进行基本的编码呢?他们不能教类只能从一个基类继承,但是下一个类可以继承那个类和下一个类。没有真正的限制,这可能吗c#中的所有内容都已从Object继承,但如果没有源代码,则无法编写更改另一个类继承的内容的代码class@CaiusJard不,他指的是.NETFramework中的对象。哇,我不知道我可以将接口用作列表类型!这是一条很好的捷径。你会用什么样的图案来清理?不是这个!问题是,您很少有一个完全不同的随机类列表,需要一次性清理所有这些类。无论哪一类
public abstract class Building :IPhotoTaking
{
  public Image TakePhoto();
}

public class House : Building
{
}

public class Museum : Building
{
}
var animals = new List<Animal>();

foreach ( var animal in animals )
  animal.DoSound();
var items = new List<IPhotoTaking>();

foreach ( var item in items )
  item.TakePhoto();