我的问题是我想将一个对象传递给派生类,但它必须在基类构造函数之前完成,因为基类将立即调用派生类Start()
使用该对象的方法.
以下是基类的摘录(为方便起见,从BarcodeScanner重命名).
public abstract class MyBase
{
public MyBase()
{
if (Initialize())
this.Start();
}
public abstract bool Initialize();
public abstract void Start();
}
Run Code Online (Sandbox Code Playgroud)
这是我正在创建的派生类.
class MyDerived : MyBase
{
private string sampleObject;
public MyDerived (string initObject)
{
sampleObject = initObject;
}
public override bool Initialize()
{
return GetDevice();
}
public override void Start()
{
Console.WriteLine("Processing " + sampleObject.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
我怀疑你可以让C#在基础构造函数之前执行派生构造函数; 所以我真的只是在寻找一个解决方案,在使用对象之前将对象传递给派生类.
我通过在MyDerived
构造函数中放置Initialize/Start if块来解决这个问题.但是,还有其他类派生自基类; 所以我最终不得不在每个派生类中重复这个Initialize/Start代码块.我想看一个修改基类的替代方法.
在我参与的几个Web应用程序项目中,客户端要求能够创建自己的表单.问题出现在如何存储其表单定义,以及如何将用户输入的值存储到这些自定义表单中.
我已经看到它有两种方式:
假设客户端仅定义了多少个字段,以及与这些字段关联的标签; 我们可以找到一个涉及四个表的解决方案. FormDefinition
,FormFieldDefinition
,FormInstances
,FormFieldValues
.客户端对FormDefinition
和进行更改FormFieldDefinition
,并且Web应用程序使用该信息呈现HTML Web表单,网站访问者(最终用户)将在该表单上提交表单,其中FormInstances
创建新行并将值保存在FormFieldValues
表.
行中
FormDefinition
定义了表单,即form definition ID = 2, form title = 'Car Registration Form'
.行中FormFieldDefinition
定义表单的字段FormDefinition
,即field definition ID = 7, field label = 'Car Model', field type = 'varchar(50)'
.行FormInstance
是用户填写的每个表单的实例,即definition id = 2, date_entered = '2008-09-24'
.并且行FormFieldValues
是用户的条目,即field definition = 7, value = 'Tiburon'
.
不幸的是,这意味着value列FormFieldValues
必须是客户端可能在Web表单中指定的最大可能大小的char类型...并且当表单定义更改时,管理旧数据变得不确定.但用户条目是可查询的(我写了一个快速查询,列出了给定表单ID的用户条目,这类似于 …
我想知道是否有一种简单的方法可以在同一个Android项目的分支之间进行合并,其中包名称(以及目录名称)不同.由于我将拥有许多分支机构,并且所有分支都需要保持最新,因此我正在寻找有效地进行这些合并的最佳方法.
我们的Android项目的目录树看起来像这样
\assets
\libs\...
\res\...
\src\com\mycompany\mainproject
AndroidManifest.xml
build.xml
myproject.iml
myproject.ipr
Run Code Online (Sandbox Code Playgroud)
当我们为客户端制作自定义版本时,我会更改包名称,例如client1app或client2app.如果要在Android Market中作为不同客户端的不同应用程序存在,则需要不同的程序包名称.所以我创建了包含相同文件名和目录结构的单独分支,但src文件夹名称除外,必须更改该名称以匹配包名称.因此client1app或client2app将具有以下目录结构:
\src\com\mycompany\client1app
\src\com\mycompany\client2app
Run Code Online (Sandbox Code Playgroud)
这些文件夹下的文件名仍与mainproject相同.只是目录名称不同.(除了package子句之外,文件内容大多相同.)
我们使用SVN进行源代码控制.所以,当我从mainproject合并到client1app时,我想我必须首先合并顶级文件和其他目录,然后为src\com\mycompany\mainproject手动执行合并到src\com\mycompany\client1app.这是五种不同的合并,(对于顶级和四个子目录).如果不是目录名称不同,这将是一个简单的单步合并,我知道如何做到这一点.
问题1:有没有任何配置我可以告诉SVN\src\com\mycompany\mainproject和\ src\com\mycompany\client1app在合并时包含相同的文件名?或者其他一些方法可以在两个分支之间轻松合并cherrypick?
问题2:Git会更适合这个吗?
所以我发现烦人的是,使用自定义任务方法,我需要总是返回一个新的Task,就像下面的Foo0()一样.但有趣的是,在Xamarin中,如果放入async关键字,则可以删除返回的新Task块.
Foo0和Foo1是否相同?
这是Xamarin实现的故障,还是在VS2012中也能正常工作?
但是Foo1给出了编译器警告,我不能只删除async关键字,否则它将停止编译,即使代码的主体保持不变.(我发现Foo0中的额外新任务块是多余的,从方法声明中我应该明白我想要运行一个新任务.)
// the following is explicit with returning a new task
Task<int> Foo0()
{
return Task.Run(() =>
{
return 5;
});
}
// the following gives warning "Async block lacks `await` operator and will run synchronously"
async Task<int> Foo1()
{
return 5;
}
/* the following does not compile
Task<int> Foo2()
{
return 5;
}
*/
Run Code Online (Sandbox Code Playgroud)