这是课堂设计问题.
我有主要的抽象类
public abstract class AbstractBlockRule
{
public long Id{get;set;}
public abstract List<IRestriction> Restrictions {get;};
}
public interface IRestriction{}
public interface IRestriction<T>:IRestriction where T:struct
{
T Limit {get;}
}
public TimeRestriction:IRestriction<TimeSpan>
{
public TimeSpan Limit{get;set;}
}
public AgeRestriction:IRestriction<int>
{
public int Limit{get;set;}
}
public class BlockRule:AbstractBlockRule
{
public virtual List<IRestriction> Restrictions {get;set;}
}
BlockRule rule=new BlockRule();
TimeRestriction t=new TimeRestriction();
AgeRestriction a=new AgeRestriction();
rule.Restrictions.Add(t);
rule.Restrictions.Add(a);
Run Code Online (Sandbox Code Playgroud)
我必须使用非泛型接口IR限制,以避免在主抽象类中指定泛型类型T. 我对仿制药很新.有人可以让我知道如何更好地设计这个东西吗?
在我的一次采访中我被问到这个问题,但我无法确切地知道为什么这个概念不存在.
请告诉我.
昨天我问了一个关于在C#中复制对象的问题,大多数答案都集中在深拷贝和浅拷贝之间的区别,以及应该弄清楚两个拷贝变体中的哪一个给定拷贝构造函数(或运算符或函数)的事实.实现.我发现这很奇怪.
我用C++编写了很多软件,这种语言很大程度上依赖于复制,我从来不需要多种复制变体.我用过的唯一一种复制操作是我称之为" 足够深的复制 ".它执行以下操作:
现在,我的问题有三个:
我知道从另一个类继承的类可能会使用new关键字隐藏属性.但是,这隐藏了属性的特定实现,因此我可以看到它是如何使用的.
是否有任何实际的理由在实现其他接口的接口中隐藏成员?例如,考虑以下示例.IChildInterface 实施IParentInterface和隐藏PropertyA.
interface IParentInterface
{
string Name { get; set; }
int PropertyA { get; set; }
int PropertyB { get; set; }
}
interface IChildInterface : IParentInterface
{
int PropertyA { get; set; }
int PropertyC { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 我了解对象的深层克隆和浅层克隆之间的区别,但是根据西蒙对这个问题的回答(复制构造函数对克隆),应该提供通用和非通用版本。为什么?
您可以定义两个接口,一个具有通用参数以支持强类型克隆,而一个接口则不具有弱类型克隆功能,以供您处理不同类型的可复制对象的集合时使用:
我的意思是小事足以让不同的接口,但在现代的C#泛型重的范例,我发现来很难了一个正当的理由,为什么你会永远想使用非通用和弱类型版本。哎呀,你甚至可以T:object做同样的事情!
我会这样写我的接口:
public interface IShallowCloneable
{
object Clone();
}
public interface IShallowCloneable<T> // Should this derive IShallowCloneable?
{
T Clone();
}
public interface IDeepCloneable
{
object Clone();
}
public interface IDeepCloneable<T> // Should this derive IDeepCloneable?
{
T Clone();
}
Run Code Online (Sandbox Code Playgroud)
我的班级会像这样实现它:
public class FooClass : IDeepCloneable<FooClass>
{
// Implementation
}
Run Code Online (Sandbox Code Playgroud) 我有一个字典,这样: Dictionary<string, SomeClass> template
基本上,我想要做的是获取包含在其中的对象的副本template.但是,我似乎无法创建一个按值检索对象的方法.我知道ref和out,但这些与我想要的完全相反.结构将是完美的,但不幸的是,SomeClass必须从另一个类和/或接口继承.
有什么办法可以做我想要的吗?这看起来应该非常简单.
我有两个对象,但是当我更新一个时,具有相同GUID的另一个项目也会更新,即使我正在尝试应用新的GUID以便我可以将它们分开.
var completedSecond = model.CompletedTransfers.First();
var transferedTransfers = model.TransferedTransfers.First();
if (transferedTransfers.Count != 0) {
transferedTransfers.RowId = Guid.NewGuid();
}
Run Code Online (Sandbox Code Playgroud)
当我运行此代码时,这两个项具有相同的GUID,但是当我更新第二个具有新GUID时,第一个对象也获得该新GUID.这怎么可能?
所以我有一个清单:
List<Class> myList = new List<Class>
Run Code Online (Sandbox Code Playgroud)
我创建了一个等于其中一个项目的对象,以便我可以更新它:
Class item = myList[0]
Run Code Online (Sandbox Code Playgroud)
我还有该项目的副本(以便我可以在需要时恢复任何更改):
Class copyItem = myList[0]
Run Code Online (Sandbox Code Playgroud)
当我更新item项目时myList也会更新,这就是我想要的。
但是我不希望 . 发生这种情况,copyItem我该如何制作才能使副本不引用myList?
.NET框架的ICloneable接口通常提供了一种支持克隆类实例的方法.
但是如果我有多个第三方类,并且不想单独关注每个属性,那么如何有效地克隆这些类的对象呢?(这些类的源代码不可用).有没有办法使用泛型和扩展方法?
我需要的是一个深度克隆,它创建一个包含所有属性和(子)对象的精确副本.
示例:假设您要UserQuery在LinqPad中克隆对象:
void Main()
{
UserQuery uc=this;
var copy=uc.CreateCopy(); // clone it
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找的是一个CreateCopy()扩展,允许创建一个副本,而不必照顾这个类的细节,因为我没有自己的源UerQuery.
(注意,这UserQuery只是一个示例,用于显示我需要的内容,它也可以是PDF文档类,用户控件类,ADO.NET类或其他任何内容).
我有一个列表apples,我发现那些是红色的:
var redApples = apples.Where(a => a.colour == "red");
Run Code Online (Sandbox Code Playgroud)
redApples是一个IEnumerable在这里,所以如果我将其转换为列表:
var redApplesList = redApples.ToList();
Run Code Online (Sandbox Code Playgroud)
这给了我一个新对象列表.所以,如果我修改这些对象:
redApplesList.ForEach(a => a.color = "blue");
Run Code Online (Sandbox Code Playgroud)
我不希望原始apples列表中的项目根本改变颜色.但这不是发生的事情,我原来列表中的苹果"red"现在都是"blue".
这里有什么误会?
我在印象中ToList()创建了一个独立于现有列表的全新项目列表,但这表明原始列表中的指针已更新为指向新创建的对象?这是发生在引擎盖下的事情吗?
许多开发人员似乎都倾向于将事物分离成单独的列表(甚至是克隆对象),因为他们从不100%确定他们正在使用什么.了解这一领域将是有益的.