Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.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/6/cplusplus/136.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#_C++_Class_Inheritance - Fatal编程技术网

C# 类设计与继承

C# 类设计与继承,c#,c++,class,inheritance,C#,C++,Class,Inheritance,我是OO设计/编程新手,我有一个关于类设计的问题。我将尽我所能准确地使用我的术语 [编辑] 也许可以归结为:我有一个基类类型的对象列表。派生类被创建为基类的特定类型,实现基类的方法,一些派生类还具有特定于派生类型的附加参数和/或方法。当我横切列表时,我使用的是基类引用。然后访问特定变量类的方法和参数的好方法是什么?转换语句和铸造?这在C#中是不是很糟糕,并且表明类设计中存在缺陷 [原件] 以《C++编程语言》中的StruouTutp为例,假设我正在编写一个图形程序,它使用基类“形状”,并从“形状

我是OO设计/编程新手,我有一个关于类设计的问题。我将尽我所能准确地使用我的术语

[编辑] 也许可以归结为:我有一个基类类型的对象列表。派生类被创建为基类的特定类型,实现基类的方法,一些派生类还具有特定于派生类型的附加参数和/或方法。当我横切列表时,我使用的是基类引用。然后访问特定变量类的方法和参数的好方法是什么?转换语句和铸造?这在C#中是不是很糟糕,并且表明类设计中存在缺陷

[原件] 以《C++编程语言》中的StruouTutp为例,假设我正在编写一个图形程序,它使用基类“形状”,并从“形状”派生出类“圆”、“三角形”和“平方”。根据Stroustrup,基类必须包含实现shape类的“全套操作”所需的成员函数。在大多数情况下,这些成员函数都是虚拟的,因此派生类可以实现特定于其形状的功能,例如:加载、保存、绘制、旋转、更新等。这些对我来说都很有意义

我遇到的困难是形状类型之间细微差异的影响以及这些差异对基类的影响。例如,考虑特定派生形状所特有的成员函数。假设“圆”形状具有一个值,该值描述了用于近似圆的线段数(例如,线数)。我如何处理设置和更新这个值,而不让虚拟成员函数开始污染我的基类,即每个派生类的特定需求“冒泡”

我这样问是因为我希望保留一个类型为“shape”的列表来跟踪我的所有对象。我不希望有“圆”、“三角形”和“正方形”类型的列表如果可以直接访问特定于圆的lineCount值,那么保留这些单独的列表是否会通过隐式或显式引入等价于switch语句的语句(每个形状类型都有大小写)违反继承的整体思想呢

为了解决这个问题,我是否正确地认为,除了“draw”等明显的成员功能外,我还必须深入思考“全套操作”需求。因此,如果我有一个特定于形状的值(例如圆形的lineCount),则必须可以通过形状的成员函数,以与其他形状类型的其他(可能不同)值兼容的常规方式获取/设置该值。因此,我只能认为shape类必须包含一个通用参数设置函数,该函数可能包括要求每个派生类显示其自己的UI表单,请求其特定的shape参数。shape类需要包含UI成员函数,这感觉shape类太重了


我这样想对吗?有没有更好的方法来处理派生类中的细微差异?

您需要思考
lineCount
对于矩形意味着什么。 如果你发现这个概念适用于所有的形状,那么它是一个很好的选择,可以放入
shape
类中。 另一方面,如果矩形没有意义,那么它可能只属于circle类


现在,如果你有一个
shape
数组,你应该忽略实际的实现。如果只有圆形具有
lineCount
,这很好,但是当您使用形状数组时,您不会使用与
lineCount
有关的任何东西,因为它不适用于所有形状(为矩形设置
lineCount
意味着什么?

用户2079303的点是一个好点,我认为您可能会对“全套操作”语言感到困惑——这只是意味着
Shape
类应该知道如何使用
Shape
s做所有您想做的事情,而不是它应该知道如何使用圆和三角形等做所有您想做的事情。如果您可以只更改
Circle
对象(您知道的绝对是圆的东西)的行数,而不更改
Shape
对象(可能是圆的东西,也可能不是圆的东西),那么可以在
Circle
类中使用
changeLineCount()
方法


我无法想象你想要改变你不知道的事实是圆的行数的情况。使用switch语句来确定某个东西是否是圆,或者改变行数对矩形没有意义(我不知道这是怎么回事)。

解决这一问题的一个方法是使用
std::map
(或者
字典
用于C#)配置数据和一个虚拟的
configure
函数,您可以调用它来传递每个形状类型所需的数据。所有子类都应该在基类中实现“全套操作”。但这并不意味着基类应该支持任何子类可能具有的所有操作。只需将这些函数放入需要它的子类中即可。Zac,您的评论是否与解决所有圆都需要一个lineCount值的特定问题有关,其中一个lineCount值存储为配置参数,可以应用于所有圆。如果是这样,我相信我理解你的意思。但我的问题更一般,每个特定的形状类型都有唯一的值,这些值仅对它来说是唯一的。是否有比“全套操作”或对列表中存储的shape类型的对象使用CAST/switch语句更好的解决方案?@BobC更好的解决方案是改进设计,这样在需要特定类型的操作时就很少或根本没有这种情况。例如,
lineCount
似乎是特定的属性