我有一个公共程序集/项目,它有一个抽象基类,然后是几个我想公开给其他程序集的派生类.
我不希望抽象基类出现在Intellisense中的这些其他程序集中,所以我想我会成功internal
,但是我得到了这个错误:
可访问性不一致:基类"设置"比"IrcSettings"类更难访问....
我真的不明白.我被迫制作抽象Settings
类public
,因此在这个程序集之外可见.
我怎样才能成为这门课internal
呢?
在Python 2.x中,当您想要将方法标记为抽象时,您可以像这样定义它:
class Base:
def foo(self):
raise NotImplementedError("Subclasses should implement this!")
Run Code Online (Sandbox Code Playgroud)
然后,如果您忘记覆盖它,您会收到一个很好的提醒异常.是否有相同的方法将字段标记为抽象?或者在类docstring中说明它你能做什么?
起初我以为我可以将字段设置为NotImplemented,但是当我查看它的实际内容(丰富的比较)时,它似乎是侮辱性的.
假设我们有两个方法M1()
,并M2()
在接口.抽象类也有两个相同的抽象方法.如果任何类实现了此接口或从抽象类继承,则必须同时实现其中的方法.
所以对我来说,似乎我的场景中的接口或抽象类的行为相同.那么,任何人都可以在这个特定的情况下突出显示这两者之间的区别,并建议是否在这里使用抽象类或接口?
可能重复:
为什么我不能在抽象C#类上创建抽象构造函数?
为什么我不能像这样声明抽象类的构造函数:
public abstract class MyClass {
public abstract MyClass(int param);
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个如下所示的抽象基类:
class StellarObject(BaseModel):
title = models.CharField(max_length=255)
description = models.TextField()
slug = models.SlugField(blank=True, null=True)
class Meta:
abstract = True
Run Code Online (Sandbox Code Playgroud)
现在,假设我有两个从StellarObject继承的实际数据库类
class Planet(StellarObject):
type = models.CharField(max_length=50)
size = models.IntegerField(max_length=10)
class Star(StellarObject):
mass = models.IntegerField(max_length=10)
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.如果我想获得行星或星星,我所做的就是:
Thing.objects.all() #or
Thing.objects.filter() #or count(), etc...
Run Code Online (Sandbox Code Playgroud)
但是如果我想获得所有StellarObjects呢?如果我做:
StellarObject.objects.all()
Run Code Online (Sandbox Code Playgroud)
它当然会返回错误,因为抽象类不是实际的数据库对象,因此无法查询.我读过的所有内容都说我需要做两个查询,一个是行星和星星,然后合并它们.这似乎非常低效.这是唯一的方法吗?
我正在尝试创建一个使用getter定义属性的抽象类.我想将它留给派生类来决定是否要为属性实现setter.这可能吗?
到目前为止我所拥有的:
public abstract class AbstractClass {
public abstract string Value { get; }
public void DoSomething() {
Console.WriteLine(Value);
}
}
public class ConcreteClass1 : AbstractClass {
public override string Value { get; set; }
}
public class ConcreteClass2 : AbstractClass {
private string _value;
public override string Value {
get { return _value; }
}
public string Value {
set { _value = value; }
}
}
public class ConcreteClass3 : AbstractClass {
private string _value;
public override string …
Run Code Online (Sandbox Code Playgroud) 我正在研究一个系统,其中多个客户端对象需要通过接口实现特定的功能,我希望该函数与continuation异步运行(我希望这些实现是I/O绑定的并且想要确保所有客户端对象尽快完成此功能).我正在使用Visual Studio异步CTP刷新SP1,C#"5.0".
在抽象类的子对象中强制执行异步行为的推荐做法是什么(见下文)?我不能(显然)使用虚方法方法强制使用'异步'方法.我只能要求'任务'返回类型.这是否意味着我不应该尝试在子对象中完全要求异步行为?在这种情况下,返回类型应该简单地"无效"吗?
公共接口现在是系统设计的一个不幸后果,但这是一个单独的问题.显然,我无法限制任何人绕过'BaseFoo'并实现'IFoo'接口的异步.
这是代码:
public interface IFoo
{
void Bar(); //NOTE: Cannot use 'async' on methods without bodies.
}
public abstract class BaseFoo : IFoo
{
public async void Bar()
{
await OnBar(); //QUESTION: What is the right "async delegation" pattern?
}
protected virtual async Task OnBar()
{
await TaskEx.Yield();
}
}
public class RealFoo : BaseFoo //NOTE: May be implemented by 3rd party
{
protected override async Task OnBar()
{
//CLIENT: Do work, potentially awaiting async calls
await …
Run Code Online (Sandbox Code Playgroud) 我经常发现自己将类中的常见行为提取到helper/utility类中,这些类只包含一组静态方法.我经常想知道我是否应该将这些类声明为抽象类,因为我无法真正想到实例化这些类的正当理由?
优点和缺点是宣布这样一个类是抽象的.
public [abstract] class Utilities{
public static String getSomeData(){
return "someData";
}
public static void doSomethingToObject(Object arg0){
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个自定义属性,我想应用于我的基本抽象类,以便我可以跳过在HTML中显示项目时用户不需要查看的元素.似乎覆盖基类的属性不继承属性.
重写基本属性(抽象或虚拟)是否会破坏原始属性上的属性?
从属性类定义
[AttributeUsage(AttributeTargets.Property,
Inherited = true,
AllowMultiple = false)]
public class NoHtmlOutput : Attribute
{
}
Run Code Online (Sandbox Code Playgroud)
从抽象类定义
[NoHtmlOutput]
public abstract Guid UniqueID { get; set; }
Run Code Online (Sandbox Code Playgroud)
从混凝土类定义
public override Guid UniqueID{ get{ return MasterId;} set{MasterId = value;}}
Run Code Online (Sandbox Code Playgroud)
从类检查属性
Type t = o.GetType();
foreach (PropertyInfo pi in t.GetProperties())
{
if (pi.GetCustomAttributes(typeof(NoHtmlOutput), true).Length == 1)
continue;
// processing logic goes here
}
Run Code Online (Sandbox Code Playgroud) 在C++中使用接口(抽象基类)时是否存在运行时性能损失?
abstract-class ×10
c# ×6
.net ×1
async-await ×1
asynchronous ×1
attributes ×1
c#-5.0 ×1
c++ ×1
constructor ×1
django ×1
getter ×1
inheritance ×1
interface ×1
java ×1
oop ×1
performance ×1
properties ×1
python ×1
reflection ×1
setter ×1