我只想确认一下我对C#中的Generics的理解.这已经出现在我使用的几个代码库中,其中使用通用基类来创建类型安全的派生实例.我正在谈论的一个非常简单的例子,
public class SomeClass<T>
{
public virtual void SomeMethod(){ }
}
public class DeriveFrom :SomeClass<string>
{
public override void SomeMethod()
{
base.SomeMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
当我想以多态方式使用派生实例时,问题出现了.
public class ClientCode
{
public void DoSomethingClienty()
{
Factory factory = new Factory();
//Doesn't compile because SomeClass needs a type parameter!
SomeClass someInstance = factory.Create();
someInstance.SomeMethod();
}
}
Run Code Online (Sandbox Code Playgroud)
看来,一旦将Generic引入继承层次结构或接口,就不能再以多态方式使用该类族,除非它本身就是内部的.真的吗?
为什么第一次调用someMethod没有明确表示它是String []?
可以使用数组初始值设定项创建String []数组,但不能使用它来传递参数.花括号是否以某种其他方式用于传递参数,这些参数会破坏我对此行为的看法?
public void someMethod(String[] arr){
//do some magic
}
public void makeSomeMagic(){
String[] arr = {"cat", "fish", "cow"};
//Does not compile!
someMethod({"cat", "fish", "cow"});
//This compiles!
someMethod(new String[]{"cat", "fish", "cow"});
//This compiles!
someMethod(arr);
}
Run Code Online (Sandbox Code Playgroud)
编译器错误如下:
Moo类型中的方法someMethod(String [])不适用于参数(String,String,String)
我已经在其他回答的问题中看到了关于何时抛出异常的建议,但现在我的API有了新的噪音.我没有调用try/catch块中包含的方法(烦恼的异常),而是使用可能在处理过程中发生的错误集合的参数参数.我理解为什么在try/catch中包装所有内容是控制应用程序流程的一种不好的方法,但我很少看到反映这种想法的代码.
这就是为什么整件事对我来说似乎很奇怪.这种做法应该是正确的编码方式,但我没有在任何地方看到它.除此之外,我还不太清楚当"坏"行为发生时如何与客户端代码相关联.
以下是我正在讨论的一些代码片段,用于保存由网络应用用户上传的图片.不要让细节出汗(这很难看),只要看看我将这些输出参数添加到所有内容以获取错误消息的方式.
public void Save(UserAccount account, UserSubmittedFile file, out IList<ErrorMessage> errors)
{
PictureData pictureData = _loader.GetPictureData(file, out errors);
if(errors.Any())
{
return;
}
pictureData.For(account);
_repo.Save(pictureData);
}
Run Code Online (Sandbox Code Playgroud)
这是正确的想法吗?我可以合理地期望用户提交的文件在某种程度上是无效的,所以我不应该抛出异常,但是我想知道文件有什么问题,所以我产生错误消息.同样,任何现在使用此保存方法的客户端也希望找出整个图片保存操作的错误.
关于返回包含结果和其他错误消息的状态对象,我有其他想法,但这感觉很奇怪.我知道在任何地方都有参数很难维护/重构/等.
我会喜欢这方面的指导!
编辑:我认为用户提交的文件片段可能会让人们想到加载无效图像和其他"硬"错误所产生的异常.我认为这段代码片段更好地说明了我认为抛出异常的想法在哪些方面是不受欢迎的.
有了这个,我只是保存一个新的用户帐户.我在用户帐户上进行状态验证,然后点击持久存储以查明是否已使用用户名.
public UserAccount Create(UserAccount account, out IList<ErrorMessage> errors)
{
errors = _modelValidator.Validate(account);
if (errors.Any())
{
return null;
}
if (_userRepo.UsernameExists(account.Username))
{
errors.Add(new ErrorMessage("Username has already been registered."));
return null;
}
account = _userRepo.CreateUserAccount(account);
return account;
}
Run Code Online (Sandbox Code Playgroud)
我应该抛出某种验证异常吗?或者我应该返回错误消息?
我正在使用NetBeans,但似乎对Ruby的支持正式死亡(一些社区元素刚刚启动).我已经看到了用于破解ruby-debug的线程以支持NB中的Ruby 1.9调试,但我觉得这不是可行的方法.我刚刚安装了Aptana3,它会很高兴地击中断点,但不支持限制可见性的监视表达式.我似乎无法找到一个直接的答案,为什么它不受支持或是否有任何计划包括它.
在某种文本编辑器中调试Rails3/1.9.2有明显的优势吗?
c# ×2
arrays ×1
debugging ×1
exception ×1
generics ×1
ide ×1
java ×1
polymorphism ×1
ruby-1.9.2 ×1