相关疑难解决方法(0)

C#有扩展属性吗?

C#有扩展属性吗?

例如,我可以添加一个扩展属性来DateTimeFormatInfo调用ShortDateLongTimeFormat哪个会返回ShortDatePattern + " " + LongTimePattern

c# extension-methods properties

712
推荐指数
5
解决办法
19万
查看次数

C#应该有多重继承吗?

我遇到过许多反对在C#中包含多重继承的论据,其中一些包括(除了哲学论证):

  • 多重继承过于复杂,而且往往含糊不清
  • 这是不必要的,因为接口提供类似的东西
  • 如果接口不合适,组合是一个很好的替代品

我来自C++背景,错过了多重继承的力量和优雅.虽然它不适合所有软件设计,但在某些情况下很难否认它在接口,组合和类似的OO技术上的实用性.

是否排除了多重继承,说开发人员不够聪明,不能明智地使用它们,并且在它们出现时无法解决这些复杂问题?

我个人欢迎将多重继承引入C#(也许是C##).


附录:我很想知道来自单一(或程序背景)与多重继承背景的回复.我经常发现,没有多重继承经验的开发人员通常会默认使用多继承是不必要的参数,因为他们没有任何关于范例的经验.

c# inheritance multiple-inheritance

54
推荐指数
9
解决办法
1万
查看次数

接口与C#中的多重继承

我有一组A类和B类都有一些属性.和另一个有自己特性的C类.

每当我创建一个C类实例时,我想用objClassC访问所有三个类的所有属性.

我怎样才能在C#中实现这一目标?

我面临两个问题: -

  1. 我不能继承C类中的类A,B(C#不支持多重继承)
  2. 如果我使用接口而不是A类,B(在接口中我们不能包含字段)

.net c# interface multiple-inheritance

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

创建一个具有两个其他对象的所有属性的对象?

考虑体育俱乐部的情况.俱乐部可以有一个俱乐部经理和一个或多个教练(每个团队一个教练)所以,这里是经理和教练课程的一个例子.

Class ClubManager
{
    public void RegisterMember()
    {
        // code for registering a member..
    }
}

Class Coach
{
    public void DeviceTeamFormation()
    {
        // code for making a team formation..
    }
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我怎么能有一个也是教练的俱乐部经理?因为有这种情况的体育俱乐部.

感谢任何和所有的帮助.多谢你们.

c# inheritance multiple-inheritance

7
推荐指数
2
解决办法
236
查看次数

依赖关系注入以提供通用服务接口的最特定实现的机制

我觉得我像标题一样玩了流行语宾果游戏。这是我要问的一个简洁示例。假设我对某些实体有一些继承层次结构。

class BaseEntity { ... }
class ChildAEntity : BaseEntity { ... }
class GrandChildAEntity : ChildAEntity { ... }
class ChildBEntity : BaseEntity { ... }
Run Code Online (Sandbox Code Playgroud)

现在让我们说说我为服务提供了一个通用接口,该接口具有使用基类的方法:

interface IEntityService<T> where T : BaseEntity { void DoSomething(BaseEntity entity)... }
Run Code Online (Sandbox Code Playgroud)

我有一些具体的实现:

class BaseEntityService : IEntityService<BaseEntity> { ... }
class GrandChildAEntityService : IEntityService<GrandChildAEntity> { ... }
class ChildBEntityService : IEntityService<ChildBEntity> { ... }
Run Code Online (Sandbox Code Playgroud)

假设我已经将所有这些都注册到了容器中。所以,现在我的问题是,如果我迭代通过ListBaseEntity?我如何获得注册的服务与最接近的匹配?

var entities = List<BaseEntity>();
// ...
foreach(var entity in entities)
{
    // Get the …
Run Code Online (Sandbox Code Playgroud)

c# generics dependency-injection strategy-pattern decorator-pattern

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

需要的建议:替代.NET中的"is"和"as"运算符

我希望这个问题不被认为过于主观 - 我真的不期待一个明确的答案,但我希望每个人的意见至少能帮助我形成自己的意见.

我正在实现一个自定义类型系统,它是经典OOP类型系统的超集.在这种类型的系统中,对象实例可以在运行时组合以形成新的实例,同时保留个体身份.

这段代码:

var p = new Person();
var pa = new Partner(p);
Run Code Online (Sandbox Code Playgroud)

...产生单个组合对象,其中"p"和"pa"是不同的符合OOP的视图.IOW,更改其中一个视图的属性值会立即反映在同时包含此属性的任何其他视图上.

这一切都运行良好,但它缺少两个用于查询类型标识的关键API.我真的希望能够编写这样的代码:

if (p is Partner)
{
    (p as Partner).SomePartnerProperty = "...";
}
Run Code Online (Sandbox Code Playgroud)

这当然不起作用,因为"is"和"as"操作符的行为不能超出/扩展超出.NET的OOP规则所要求的范围.尽管如此,我仍然需要在我的类型系统中使用此功能.

我的第一个想法是使用附加到我的类型系统的所有实例的通用扩展方法:

public static bool Is<T>(this BaseType target) where T : BaseType { ... }
public static T As<T>(this BaseType target) where T : BaseType { ... }
Run Code Online (Sandbox Code Playgroud)

忽略不区分大小写的语言中的名称冲突问题,这在功能方面似乎没问题:

if (p.Is<Partner>())
{
    p.As<Partner>().SomePartnerProperty = "...";
}
Run Code Online (Sandbox Code Playgroud)

但是,我不禁想知道 - 这真的是最好的,最方便的API吗?

您如何建议我实现这两个操作符,以便在应用程序代码中使用它们自然?

更新:对于任何想知道这种类型系统的目的的人......基本上,每种类型都属于两类:身份角色.在我上面给出的示例中,Person是一个Identity(按设计),而Partner是一个Role(再次,通过设计 - 它的设计可能不同).这种类型的系统的基本规则是,任何数量的角色可以与任何给定的身份组成,而身份本身可能只用一个更高的身份组成(例如一个人有可能成为一个联系,但绝不能成为公司).这种类型系统使应用程序能够透明地处理例如合作伙伴对象,而不管他们拥有什么身份(例如,人员,公司,银行等).

.net c# type-systems

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

具有相同实现但基类不同的2个类的C#设计模式

取两个基类A和B,它们相似但最好是不同的.每个子类都有一个子类(A'和B'),它们将相同的功能和成员添加到它们各自的类中.是否有设计模式允许我不必重复A'和B'中的代码?

我看BridgeDecorator,但我看不出这是可行的.

谢谢,罗布

c# design-patterns dry

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