gpt4 book ai didi

c# - 使用接口(interface)时实现类的特定类型

转载 作者:行者123 更新时间:2023-11-30 15:10:14 26 4
gpt4 key购买 nike

考虑以下代码示例:

interface IData {
int Count();
}

interface IOperations {
IData Foo();
double Bar(IData a);
}

class Data1 : IData {
public int Count() { return 37; }
public double SomethingElse { get; set; }
}

class Ops1 : IOperations
{
public Data1 Foo() { return new Data1(); } // want to return specific type here
public double Bar(Data1 x) { ... } // want to get specific type here
// and not use operator as everywhere
}

// more definitions of classes Data2, Ops2, Data3, Ops3, ...

// some code:
Ops1 a = new Ops1();
Data1 data = a.Foo(); // want Data1 here not IData!
double x = a.Bar(data);

我当然可以只使用 public IData Foo() { return new Data1(); :

// some code
Ops1 a = new Ops1();
Data1 data = a.Foo() as Data1;

但是随着 as 无处不在,代码很快就会变得困惑。

我想知道是否有一个好的设计模式以一种清晰而强大的方式实现这一点?

编辑很重要,Ops 和 Data 共享一个公共(public)基类:

List<IOperations> ops = ...;
List<IData> data = ...;
List<double> result = ...;
for(int i=0; i<ops.Count; i++)
result[i] = ops[i].Bar(data[i]);

所以对于返回类型的情况,我想知道这是禁止的,因为我满足了接口(interface)的要求。在有参数的情况下,可能需要一些额外的(模板)层。

最佳答案

你可以使用泛型:

interface IOperations<T> where T: IData
{
T Foo();
double Bar(T a);
}

class Ops1 : IOperations<Data1>
{
public Data1 Foo() { return new Data1(); }
public double Bar(Data1 x) { /* ... */ }
}

关于c# - 使用接口(interface)时实现类的特定类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3483751/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com