我做了一些搜索(也许我没有很好地描述我的问题)但是却找不到答案
假设你有以下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的许多不同机制中的一个,这个逻辑似乎不属于StandardObject附近的任何地方.
我的应用程序中有一个资源字典,其中它们是为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) 我正在开发Xamarin的iOS应用程序(不使用Forms,使用Xamarin.iOS),我注意到我的Xamarin内置应用程序中出现的键盘比其他应用程序中出现的键盘大.
我的应用程序
EG其他iOS应用程序(Apple Notes)
这些数字并不重要,重要的是两个键盘在键高和键间距方面的尺寸肯定存在差异.
似乎没有任何明显的选项或设置.尝试不同的键盘样式(我使用"默认")并不能解决问题.
我想让我的键盘与普通的iOS应用程序键盘大小相同.
编辑
Krumelur的回答是正确的.
这就是我指定启动屏幕的方式
在Visual Studio中,如果通过IDE编辑项目文件,则似乎存在丢失此XML条目的问题.
以下是两行代码:
XmlDocument xmlDoc = new XmlDocument(filePath);
string k = xmlDoc.XmlToString();
Run Code Online (Sandbox Code Playgroud)
我想做的是:
最初,在XmlDocument类下没有"XmlToString"方法,我该如何创建这样的方法?
c# ×2
inheritance ×1
ios ×1
keyboard ×1
oop ×1
types ×1
wpf ×1
xamarin ×1
xamarin.ios ×1
xaml ×1