我不明白 base 类 的继承
I don't understand inheritance with base classes
我对继承的理解很基础。
我想创建一个实现 IDisposable
的基础 class,然后让其他具有功能的 class 继承自该基础 class,以便它们共享基本类型。
它可以让我把每个对象都放在一个列表中,这样我就可以在我想清理的时候一次性处理掉所有的东西。
问题是,C# 中的 class 只能继承一次,否则只能使用接口。
现在,class 怎么能像 Thread
一样从我的基础 class 继承而无需我对 Thread
class 进行基本编码又是?
这听起来可能很愚蠢,但简而言之:我想让现有的 classes 继承我选择的基础 class 而不会失去其功能。 (这样一个项目中使用的所有classes都有一个共同的基础,归纳为一个对象类型,比如List
)
这可能吗?
如果您的目标是简单地存储可以处理的对象列表,那么您需要 List<IDisposable>
。任何直接或间接实现该接口的 class 都可以存储在其中。
var disposables = new List<IDisposable>();
disposables.Add(new MyClass1());
disposables.Add(new SomeClass());
disposables.Add(new AnotherClass());
disposables.ForEach(d => d.Dispose());
这是否是一个有价值的模式,我不服气!
您给出的示例涉及接口 IDisposable
。在C#中,class可以实现多个接口。
另一方面,在 C# 中,class 可能完全继承自 class.
话虽如此,从 classes 继承并不总是好主意,因为它非常有限。相反,我建议组合:wiki
例如,我会建议像组合设计模式这样的东西(这是一个小的变化,因为组合没有对象集合,而只有一个对象):
public interface IFoo
{
void DoFooStuff();
}
public class Foo : IFoo
{
public void DoFooStuff() {...};
}
public class ShouldImplementFoo : IFoo
{
// Composition, you need to initialize it some time
private Foo _foo;
public void DoFooStuff() { _foo.DoFooStuff(); }
}
编辑
重新考虑你的问题后,你似乎想将一些对象集(不同 classes)放在一个列表中,这样你就可以执行一些定义的动作 在列表中的每个对象上。
最简单的是:用你定义的动作定义接口:
public interface IMyIntf
{
void MyDesiredAction();
}
现在,让所有 classes 实施它。现在您可能会想“好吧,现在我需要在所有地方实施这个方法......” - 不是那样的!只需使用适配器设计模式,例如 class:
public class MyConcreteClass
{
public void ActionIWishToExecuteOnThisObject()
{ ... }
}
你只要修改为:
public class MyConcreteClass : IMyIntf
{
public void ActionIWishToExecuteOnThisObject()
{ ... }
// implement interface
public void MyDesiredAction()
{
ActionIWishToExecuteOnThisObject();
}
}
现在,您可以使用一些集合,例如 List<IMyIntf>
,将您感兴趣的所有对象放在那里并执行:
foreach(var item in myList)
item.MyDesiredAction();
一个class可以继承自祖先class(否则Object,所有的根)。
它还可以实现一些接口(或none)。
A class 可以将未实现的成员作为抽象的,因此 class 是抽象的。
成员也可以是虚拟的以启用多态性(抽象成员是)。
一旦实现,class 中就有一个东西可用,即使不是抽象的也可以实例化为真实的东西,并且对所有 children 也可用,除了那些隐藏的私有的东西在子class.
无需重复,这是 OOP 的强大功能之一。
这样做,使用抽象、封装、继承和多态,在研究了现实世界和我们工作的领域之后,我们可以设计一个这个现实世界的投影,一个我们脑海中的视图,概念有数据(字段和属性)和操作(方法),class在工件中编辑(objects)以及关系、组合、聚合、接口、组件、控件等。
因此我们可以将处理分解为不重复,例如:
- 有
Animal
class 和 Cat
和 Dog
child classes,
- 我们把动物放在
Size
和 Color
方面,
- 以及对所有动物实施的
Eat
和 Walk
方法,
- 和摘要 non-implemented
DoSound
.
因此:
- 在具体的classes
Cat
和Dog
中我们不会再次实现这些东西,
- 除了
DoSound
每个真实动物的性别都是特殊的。
关于接口,它们是虚拟合约。
例如,我们可以拥有没有共同点的动物和建筑物,乍一看(我们不会回到原子和光子),但我们希望能够管理 objects 之类的实例猫和狗,还有房子和博物馆拍照。
为了实现我们定义了一个接口 IPhotoTaking
并且在定义以前的 class 时,我们添加它们实现了这个接口。
代码示例:
public interface IPhotoTaking
{
Image TakePhoto();
}
public abstract class Animal : IPhotoTaking
{
public int Size { get; set; }
public Color Color { get; set; }
public void Eat() { ... }
public void Walk() { ... }
public abstract void DoSOund();
public Image TakePhoto();
}
public class Cat : Animal // no need to repeat IPhotoTaking
{
public override void DoSound() { ... }
}
public class Dog : Animal
{
public override void DoSound() { ... }
}
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();
同样没有多态性,因为 C# 不支持真正的多态性与菱形运算符尚未应用于 List<>
这里,我们可以使用这样的接口:
var items = new List<IPhotoTaking>();
foreach ( var item in items )
item.TakePhoto();
备注:如果拍摄的照片可能因每种类型而不同,我们可以将其设置为虚拟以专门针对每种类型实现。
What is abstraction in C#?
Association, Composition and Aggregation
What is polymorphism?
What is the difference between an interface and a class?
我对继承的理解很基础。
我想创建一个实现 IDisposable
的基础 class,然后让其他具有功能的 class 继承自该基础 class,以便它们共享基本类型。
它可以让我把每个对象都放在一个列表中,这样我就可以在我想清理的时候一次性处理掉所有的东西。 问题是,C# 中的 class 只能继承一次,否则只能使用接口。
现在,class 怎么能像 Thread
一样从我的基础 class 继承而无需我对 Thread
class 进行基本编码又是?
这听起来可能很愚蠢,但简而言之:我想让现有的 classes 继承我选择的基础 class 而不会失去其功能。 (这样一个项目中使用的所有classes都有一个共同的基础,归纳为一个对象类型,比如List
)
这可能吗?
如果您的目标是简单地存储可以处理的对象列表,那么您需要 List<IDisposable>
。任何直接或间接实现该接口的 class 都可以存储在其中。
var disposables = new List<IDisposable>();
disposables.Add(new MyClass1());
disposables.Add(new SomeClass());
disposables.Add(new AnotherClass());
disposables.ForEach(d => d.Dispose());
这是否是一个有价值的模式,我不服气!
您给出的示例涉及接口 IDisposable
。在C#中,class可以实现多个接口。
另一方面,在 C# 中,class 可能完全继承自 class.
话虽如此,从 classes 继承并不总是好主意,因为它非常有限。相反,我建议组合:wiki
例如,我会建议像组合设计模式这样的东西(这是一个小的变化,因为组合没有对象集合,而只有一个对象):
public interface IFoo
{
void DoFooStuff();
}
public class Foo : IFoo
{
public void DoFooStuff() {...};
}
public class ShouldImplementFoo : IFoo
{
// Composition, you need to initialize it some time
private Foo _foo;
public void DoFooStuff() { _foo.DoFooStuff(); }
}
编辑
重新考虑你的问题后,你似乎想将一些对象集(不同 classes)放在一个列表中,这样你就可以执行一些定义的动作 在列表中的每个对象上。
最简单的是:用你定义的动作定义接口:
public interface IMyIntf
{
void MyDesiredAction();
}
现在,让所有 classes 实施它。现在您可能会想“好吧,现在我需要在所有地方实施这个方法......” - 不是那样的!只需使用适配器设计模式,例如 class:
public class MyConcreteClass
{
public void ActionIWishToExecuteOnThisObject()
{ ... }
}
你只要修改为:
public class MyConcreteClass : IMyIntf
{
public void ActionIWishToExecuteOnThisObject()
{ ... }
// implement interface
public void MyDesiredAction()
{
ActionIWishToExecuteOnThisObject();
}
}
现在,您可以使用一些集合,例如 List<IMyIntf>
,将您感兴趣的所有对象放在那里并执行:
foreach(var item in myList)
item.MyDesiredAction();
一个class可以继承自祖先class(否则Object,所有的根)。
它还可以实现一些接口(或none)。
A class 可以将未实现的成员作为抽象的,因此 class 是抽象的。
成员也可以是虚拟的以启用多态性(抽象成员是)。
一旦实现,class 中就有一个东西可用,即使不是抽象的也可以实例化为真实的东西,并且对所有 children 也可用,除了那些隐藏的私有的东西在子class.
无需重复,这是 OOP 的强大功能之一。
这样做,使用抽象、封装、继承和多态,在研究了现实世界和我们工作的领域之后,我们可以设计一个这个现实世界的投影,一个我们脑海中的视图,概念有数据(字段和属性)和操作(方法),class在工件中编辑(objects)以及关系、组合、聚合、接口、组件、控件等。
因此我们可以将处理分解为不重复,例如:
- 有
Animal
class 和Cat
和Dog
child classes, - 我们把动物放在
Size
和Color
方面, - 以及对所有动物实施的
Eat
和Walk
方法, - 和摘要 non-implemented
DoSound
.
因此:
- 在具体的classes
Cat
和Dog
中我们不会再次实现这些东西, - 除了
DoSound
每个真实动物的性别都是特殊的。
关于接口,它们是虚拟合约。
例如,我们可以拥有没有共同点的动物和建筑物,乍一看(我们不会回到原子和光子),但我们希望能够管理 objects 之类的实例猫和狗,还有房子和博物馆拍照。
为了实现我们定义了一个接口 IPhotoTaking
并且在定义以前的 class 时,我们添加它们实现了这个接口。
代码示例:
public interface IPhotoTaking
{
Image TakePhoto();
}
public abstract class Animal : IPhotoTaking
{
public int Size { get; set; }
public Color Color { get; set; }
public void Eat() { ... }
public void Walk() { ... }
public abstract void DoSOund();
public Image TakePhoto();
}
public class Cat : Animal // no need to repeat IPhotoTaking
{
public override void DoSound() { ... }
}
public class Dog : Animal
{
public override void DoSound() { ... }
}
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();
同样没有多态性,因为 C# 不支持真正的多态性与菱形运算符尚未应用于 List<>
这里,我们可以使用这样的接口:
var items = new List<IPhotoTaking>();
foreach ( var item in items )
item.TakePhoto();
备注:如果拍摄的照片可能因每种类型而不同,我们可以将其设置为虚拟以专门针对每种类型实现。
What is abstraction in C#?
Association, Composition and Aggregation
What is polymorphism?
What is the difference between an interface and a class?