小编wda*_*avo的帖子

继承vs类型标志

我做了一些搜索(也许我没有很好地描述我的问题)但是却找不到答案

假设你有以下POCO:

public class StandardObject
{
   public string A {get;set;}
   public string B {get;set;}
}
Run Code Online (Sandbox Code Playgroud)

在程序的其他地方有一些处理StandardObjects的逻辑.存在有时可能需要以不同方式处理StandardObject的情况.我们在创建StandardObject时知道这一点,但是当前属性都不能用于确定链中的这一点.一种方法是在StandardObject上添加和设置标志或类型枚举,并在处理对象时检查它.例如

if(standardObject.IsSpecial){...}

if(standardObject.ObjectType == StandardObjectTypeEnum.Special){...}
Run Code Online (Sandbox Code Playgroud)

这似乎不是最好的方法.

另一种选择是创建派生类:

public class SpecialObject : StandardObject { }
Run Code Online (Sandbox Code Playgroud)

所以现在我们可以检查类型,而不是检查属性.例如

if(standardObject.GetType() == typeof(SpecialObject)){...}
Run Code Online (Sandbox Code Playgroud)

(根据我们正在做的事情,类型检查可能会以不同的方式实现)

请注意,SpecialObject不会以任何方式添加或更改StandardObject.它本质上是同一个对象.这种方法的优点是更灵活(EG我们可以为SpecialObject添加一些额外的属性),但实际上它不会改变.它永远是完全相同的.

对我而言,继承似乎是更好的方法.类型标志看起来像代码气味,前进继承看起来更像是正确的OOP方法.我不确定的是,鉴于StandardObject和SpecialObject是相同的,这样做是不好的做法?或者有什么理由可以避免这种情况吗?

这里有一个类似的问题:

棋子层次结构设计:继承与类型字段

然而,大多数讨论似乎都集中在国际象棋问题而不是被认为是好的设计

编辑:

封装似乎是流行的解决方案.我避免封装的原因最好在下面的例子中描述:

  • StandardObject本质上是一个DTO
  • 有一个StandardObject列表.
  • 列表得到处理,StandardObject被序列化
  • 序列化数据通过任意数量的不同协议发送到某处
  • 其中一个协议要求在StandardObject为"特殊"时设置某些参数

鉴于"特殊"案例的附加逻辑只需要处理StandardObject的许多不同机制中的一个,这个逻辑似乎不属于StandardObject附近的任何地方.

c# oop inheritance types

5
推荐指数
1
解决办法
1107
查看次数

覆盖嵌套控件中的隐式样式

我的应用程序中有一个资源字典,其中它们是为textblock定义的通用样式,此字典与app.xaml合并.

现在我有一个要求,我需要在对话框窗口中更改tabitem的样式,并根据几个触发器设置前景,我已经为tabitem和textblock定义了我自己的文本块样式和书面模板,如下所示 -

/* wriiten in common style */
       <Style TargetType="{x:Type TextBlock}">
                <Setter Property="Foreground" Value="{StaticResource BR_SE_Black}" />
                <Setter Property="TextTrimming" Value="CharacterEllipsis"/>
                <Setter Property="FontSize" Value="11"/>
                <Setter Property="FontFamily" Value="Arial Unicode MS"/>
                <Style.Triggers> 
                    <Trigger Property="controls:TextBlockService.IsTextTrimmed" Value="True">
                        <Setter Property="ToolTip" Value="{Binding Text, RelativeSource={RelativeSource Self}}"/>
                    </Trigger>
                </Style.Triggers>
            </Style>




   /* written in dialog winow */
 <Style TargetType="{x:Type TextBlock}">
            <Setter Property="VerticalAlignment" Value="Center"></Setter>
            <Setter Property="TextTrimming" Value="CharacterEllipsis"/>
            <Setter Property="FontSize" Value="11"/>
            <Setter Property="FontFamily" Value="Arial Unicode MS"/>
            <Style.Triggers>
                <Trigger Property="Controls:TextBlockService.IsTextTrimmed" Value="True">
                    <Setter Property="ToolTip" Value="{Binding Text, RelativeSource={RelativeSource Self}}"/>
                </Trigger>
            </Style.Triggers>
        </Style>

        <Style  TargetType="{x:Type TabControl}"> …
Run Code Online (Sandbox Code Playgroud)

wpf xaml

3
推荐指数
1
解决办法
1483
查看次数

Xamarin App Keyboard与iOS键盘的大小不同

我正在开发Xamarin的iOS应用程序(不使用Forms,使用Xamarin.iOS),我注意到我的Xamarin内置应用程序中出现的键盘比其他应用程序中出现的键盘大.

我的应用程序

在此输入图像描述

EG其他iOS应用程序(Apple Notes)

在此输入图像描述

这些数字并不重要,重要的是两个键盘在键高和键间距方面的尺寸肯定存在差异.

似乎没有任何明显的选项或设置.尝试不同的键盘样式(我使用"默认")并不能解决问题.

我想让我的键盘与普通的iOS应用程序键盘大小相同.


编辑

Krumelur的回答是正确的.

这就是我指定启动屏幕的方式

/sf/answers/1817214241/

在Visual Studio中,如果通过IDE编辑项目文件,则似乎存在丢失此XML条目的问题.

keyboard xamarin.ios ios xamarin

1
推荐指数
1
解决办法
893
查看次数

为特定类型创建方法

以下是两行代码:

XmlDocument xmlDoc = new XmlDocument(filePath);
string k = xmlDoc.XmlToString();
Run Code Online (Sandbox Code Playgroud)

我想做的是:

最初,在XmlDocument类下没有"XmlToString"方法,我该如何创建这样的方法?

c# extension-methods

0
推荐指数
1
解决办法
54
查看次数

标签 统计

c# ×2

extension-methods ×1

inheritance ×1

ios ×1

keyboard ×1

oop ×1

types ×1

wpf ×1

xamarin ×1

xamarin.ios ×1

xaml ×1