相关疑难解决方法(0)

继承Non-Generic One C#的通用接口

这是课堂设计问题.

我有主要的抽象类

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. 我对仿制药很新.有人可以让我知道如何更好地设计这个东西吗?

.net c# oop generics

23
推荐指数
2
解决办法
8716
查看次数

为什么C#不支持Copy Constructor的概念?

在我的一次采访中我被问到这个问题,但我无法确切地知道为什么这个概念不存在.

请告诉我.

c# copy-constructor

14
推荐指数
3
解决办法
8726
查看次数

复制构造函数/操作符/函数是否需要明确它实现的副本变体?

昨天我问了一个关于在C#中复制对象的问题,大多数答案都集中在深拷贝浅拷贝之间的区别,以及应该弄清楚两个拷贝变体中的哪一个给定拷贝构造函数(或运算符或函数)的事实.实现.我发现这很奇怪.

我用C++编写了很多软件,这种语言很大程度上依赖于复制,我从来不需要多种复制变体.我用过的唯一一种复制操作是我称之为" 足够深的复制 ".它执行以下操作:

  • 如果对象拥有成员变量的所有权(参见合成),则会以递归方式复制它.
  • 如果对象对成员变量没有所有权(参见聚合),则仅复制链接.

现在,我的问题有三个:

  • 1)对象是否需要多个副本变体?
  • 2)复制功能是否需要明确它实现的复制变体?
  • 3)顺便说一句,对于我称之为"足够深的复制品",是否有一个更好的术语?我问了一个关于"深层复制"这个术语定义的相关问题.

language-agnostic copy deep-copy shallow-copy

13
推荐指数
3
解决办法
1955
查看次数

有没有理由在界面中隐藏继承的成员?

我知道从另一个类继承的类可能会使用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)

.net c# polymorphism interface

13
推荐指数
2
解决办法
2686
查看次数

深层复制操作是否递归复制它不拥有的子变量?

给定一个具有它不拥有的变量的对象; 也就是说,变量由聚合而不是合成组成.深层复制操作是复制变量还是仅复制链接?

language-agnostic terminology deep-copy

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

什么时候应该提供接口的通用和非通用版本?

我了解对象的深层克隆和浅层克隆之间的区别,但是根据西蒙对这个问题的回答(复制构造函数对克隆),应该提供通用和非通用版本。为什么?

您可以定义两个接口,一个具有通用参数以支持强类型克隆,而一个接口则不具有弱类型克隆功能,以供您处理不同类型的可复制对象的集合时使用:

我的意思是小事足以让不同的接口,但在现代的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)

c# generics clone interface

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

使方法按值返回对象?

我有一个字典,这样: Dictionary<string, SomeClass> template

基本上,我想要做的是获取包含在其中的对象的副本template.但是,我似乎无法创建一个按值检索对象的方法.我知道refout,但这些与我想要的完全相反.结构将是完美的,但不幸的是,SomeClass必须从另一个类和/或接口继承.

有什么办法可以做我想要的吗?这看起来应该非常简单.

c# methods return-by-value

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

更新一个对象以某种方式更新其他对象

我有两个对象,但是当我更新一个时,具有相同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.这怎么可能?

c# guid

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

如何从列表中分离一个变量,它从 C# 获取它的值

所以我有一个清单:

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

c# list

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

如何"深度"克隆闭源第三方类的属性?

.NET框架的ICloneable接口通常提供了一种支持克隆类实例的方法.

但是如果我有多个第三方类,并且不想单独关注每个属性,那么如何有效地克隆这些类的对象呢?(这些类的源代码不可用).有没有办法使用泛型扩展方法

我需要的是一个深度克隆,它创建一个包含所有属性和(子)对象的精确副本.


示例:假设您要UserQueryLinqPad中克隆对象:

void Main()
{
    UserQuery uc=this;
    var copy=uc.CreateCopy(); // clone it
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是一个CreateCopy()扩展,允许创建一个副本,而不必照顾这个类的细节,因为我没有自己的源UerQuery.

(注意,这UserQuery只是一个示例,用于显示我需要的内容,它也可以是PDF文档类,用户控件类,ADO.NET类或其他任何内容).

.net c# clone class object

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

在选择现有列表的一部分的IEnumerable上调用.ToList()时,为什么在修改新列表时更新原始列表?

我有一个列表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%确定他们正在使用什么.了解这一领域将是有益的.

c#

-2
推荐指数
1
解决办法
123
查看次数